将节点插入链表中间,并意外插入空节点

Posted

技术标签:

【中文标题】将节点插入链表中间,并意外插入空节点【英文标题】:Inserting Node into middle of Linked List, and accidentally inserting null node as well 【发布时间】:2012-10-27 01:45:06 【问题描述】:

我正在开发一个不使用 Java 内置 Linked List 类的程序;我正在从头开始构建它。除了编写将节点插入到链表的特定位置的方法之外,我在所有方面都取得了成功。

我有一个将特定节点设置为“当前”节点的方法。例如,我有一个如下所示的链表:cats --> dogs --> ma​​ke --> good --> pets,“current”等于2;这意味着“当前”节点是“狗”。

从这里,假设我想在“当前”的位置插入一个新节点,其信息字段为 and。如果操作正确,最终的链表将是:cats --> and --> dogs --> ma​​ke强> --> --> 宠物; "and" 将替换位置 2 的 "dogs"。

所以这是我的问题:我的方法可以在位置 2 插入一个新节点,但是将新创建的节点链接到预先存在的节点时出现了问题。我不仅将我的新节点插入到列表中,而且还在“dogs”之前插入了一个没有信息的节点。当我的代码当前运行时,输出如下所示:cats --> and --> (空白) --> dogs -- > 制作 --> --> 宠物

我 99.9% 确定问题出在代码的(如果当前!= null)部分,我只是不知道如何解决它。

除了我实际想要添加的节点之外,我为什么还要插入一个空白节点?

public void insert () 

    System.out.println("Please enter the text you wish to insert, or type \"end\" if you are done inserting.");
    String theString;
    theString = console.nextLine();

    while (!theString.equals("end"))
        newNode = new Node ();
        newNode.info = theString;
        newNode.next = null;

        if (first == null)
            first = newNode;
            last = newNode;
         else if (current != null)
            Node p = new Node (current.info, current.next);
            current.info = newNode.info;
            current.next = p;
        
        else 
            last.next = newNode;
            last = newNode;
        

        System.out.println("Please enter the text you wish to insert, or type \"end\" if you are done inserting.");
        theString = console.nextLine();
       

编辑

整个程序很长,但这里有一个“setLine”方法,它将当前设置为用户希望插入节点的任何位置。它接受一个通过用户提示获得的参数“int line”。

public Node setLine(int line) 

    int index = 0;
    current = first;
    while (index < line) 
        previous = current;
        current = current.next;
        index++;
    
    return current;

【问题讨论】:

这种类型的事情你只需要一步一步地完成,通常需要大量的 System.out.println 调用。这确实是一个相当普遍的问题,但您需要自己弄清楚。 请注意,您应该怀疑创建第二个新节点的情况——任何插入都只需要一个。 什么是consolejava.util.Scanner 请发布您的其余代码。 是的,如果我们知道“当前”是如何设置的,那将会有所帮助。 【参考方案1】:

这是正确插入节点的代码。这应该是一个很好的起点,祝你好运(您可以在这里阅读更多内容:http://www.algolist.net/Data_structures/Singly-linked_list/Insertion)。

public class SinglyLinkedList 

      public void addLast(SinglyLinkedListNode newNode)     
            if (newNode == null)    
                  return;    
            else     
                  newNode.next = null;    
                  if (head == null)     
                        head = newNode;    
                        tail = newNode;    
                   else     
                        tail.next = newNode;    
                        tail = newNode;    
                      
                
      

      public void addFirst(SinglyLinkedListNode newNode)     
            if (newNode == null)    
                  return;    
            else     
                  if (head == null)     
                        newNode.next = null;    
                        head = newNode;    
                        tail = newNode;    
                   else     
                        newNode.next = head;    
                        head = newNode;    
                      
                
      

      public void insertAfter(SinglyLinkedListNode previous,    
                  SinglyLinkedListNode newNode)     
            if (newNode == null)    
                  return;    
            else     
                  if (previous == null)    
                        addFirst(newNode);    
                  else if (previous == tail)   
                        addLast(newNode);    
                  else     
                        SinglyLinkedListNode next = previous.next;    
                        previous.next = newNode;    
                        newNode.next = next;    
                      
                
          

【讨论】:

为什么newNode 永远为空?你为什么不抛出一个 NPE 而不是忽略它呢?【参考方案2】:

您可以参考下面的方法,根据索引在中间插入节点。

public boolean insertInMiddle(int index, int data)

    boolean isInserted = false;

    Node node = new Node(data);
    Node temp = head;
    int i=0;
    if(index >= 0 && index <= size())
        isInserted = true;
        if(index == 0)
            if(head !=null)
                node.nextNode = head;
                head.prevNode = node;
                head = node;
            else
                head = node;
                tail=node;
            
        else
            while(i<index)
                temp = temp.nextNode;
                i++;
                           
            if(temp == null)
                node.nextNode = temp;
                node.prevNode = tail;
                node.prevNode.nextNode = node;
                tail=node;
            else
                node.nextNode = temp;
                node.prevNode = temp.prevNode;
                temp.prevNode = node;
                node.prevNode.nextNode = node;
            
        
           
    return isInserted;


//Method to get the size
public int size()
    int size = 0;

    Node node = head;
    if(node !=null)
        while (node !=null)
            size++;
            node = node.nextNode;
        
    

    return size;

【讨论】:

不是所要求的。

以上是关于将节点插入链表中间,并意外插入空节点的主要内容,如果未能解决你的问题,请参考以下文章

尾插法链表拆分

使用双指针在链表之间插入新节点

5-链表

在给定节点之后将新节点插入到双向链表中

在链表中递归插入节点,给定位置和值

数据结构-编程实现一个单链表节点的插入