首页 > 解决方案 > 在链表Java中插入一个位置

问题描述

我的问题是:编写一个函数,将一个新项目插入到给定位置的整数链接列表中。我的代码是:

public static SinglyLinkedListNode insert_at_position(SinglyLinkedListNode head, int val, int pos) {
    
        SinglyLinkedListNode temp = head;
        
        if (pos == 0)
        {
            SinglyLinkedListNode newNode = new SinglyLinkedListNode(val);
            newNode = temp;
            head = newNode;
        }
        
        else if (pos > 0)
        {
            SinglyLinkedListNode newNode = new SinglyLinkedListNode(val);
            newNode = temp;
            head = newNode;
            
            for (int i = 0 ; i <= pos; i++)
            {
                  temp = head.next;
                  if (i == pos)
                  {
                      head.next = newNode;
                      newNode = temp;
                  }  
            }
        }
        return head;
 }

我的代码只打印了很多 1。它有什么问题?

标签: javalinked-listsingly-linked-list

解决方案


一些问题:

  • 代码创建一个新节点,将其分配给newNode,然后立即分配tempnewNode,从而失去对新创建节点的引用

  • temp用 的值初始化head,然后newNode获取 的值,temp然后head获取 的值temp。这意味着您已设置head为 ... head,即无操作。

  • 循环temp = head.next;在每次迭代中执行。这将始终在每次执行时将相同的引用放在... 中。temp因此循环的迭代次数变得无关紧要。temp将始终引用列表中的第二个节点。这样做会更有意义temp = temp.next

  • 在您设置的最后一次迭代中head.next = newNode;...甚至忽略您对temp. 此分配不使用循环迭代期间完成的任何操作。它也可以在循环之外执行。

  • 最后一条语句newNode = temp没有做任何有用的事情。newNode在该语句之后从未使用过,因此它可能不存在。如果是的话,它会更有意义newNode.next = temp。这将有效地链接newNode到潜在的下一个节点。

  • 循环迭代太多次。正如您习惯pos == 0在列表的开头插入新节点一样,pos == 1应该在节点之后插入新节点head不需要迭代。仅当pos > 2您需要迭代时。

这是一个更正的版本:

public static SinglyLinkedListNode insert_at_position(SinglyLinkedListNode head, 
                                                      int val, int pos) {        
    SinglyLinkedListNode newNode = new SinglyLinkedListNode(val);
    if (pos == 0) {
        newNode.next = head;
        head = newNode;
    } else if (pos > 0) {
        SinglyLinkedListNode temp = head;
        for (int i = 1; i < pos; i++) {
            temp = temp.next;
        }
        newNode.next = temp.next;
        temp.next = newNode;
    }
    return head;
}

推荐阅读