链表实现:为什么在创建新节点之前不能移动到 head.next

Linked List implementation: why cannot move to head.next before creating new node

我正在解决a challenge from hackerrank. This is the description of the question.

import java.io.*;
import java.util.*;

class Node {
    int data;
    Node next;
    Node(int d) {
        data = d;
        next = null;
    }
}

class Solution {

    public static  Node insert(Node head,int data) {
        //Complete this method        
    }

    public static void display(Node head) {
        Node start = head;
        while(start != null) {
            System.out.print(start.data + " ");
            start = start.next;
        }
    }

    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        Node head = null;
        int N = sc.nextInt();

        while(N-- > 0) {
            int ele = sc.nextInt();
            head = insert(head,ele);
        }
        display(head);
        sc.close();
    }
}

基本上是实现了一个Linked List,我最终也确实解决了问题。但是我对代码有一些疑问。

这是给出所需输出的正确代码:

    public static  Node insert(Node head,int data) {
        if (head == null) {
        head = new Node(data);
    } else {
        Node current = head;
        while(current.next != null)
            current = current.next;
        current.next = new Node(data);
    }
    return head;
    }

这是我一开始写的错误代码:

    public static  Node insert(Node head,int data) {
        if (head == null) {
            head = new Node(data);
        } else {
            Node current = head;
            while(current != null)
                current = current.next;     
            current = new Node(data);
        }        
        return head;
    }

区别在于while循环语句和while循环之后的代码。 当 运行 整个 java 代码,使用示例输入时,不正确的代码仅输出 2,其中预期输出为 2 3 4 1

我猜这与指针引用有关? 但是当我将代码分解成步骤时,错误的代码对我来说仍然是合理的。

I draw out the steps of the code(上面是正确的代码,下面是错误的代码),最后有两个问题:

  1. 不正确的代码是因为我在图片中圈出的吗?就像我在 null 时无法创建节点? (如果是这样,那为什么没有异常错误呢?)
  2. 另一件困扰我的事情是我在图像中下划线的代码看起来是等效的。

有人可以指出为什么错误的代码不能给出所需的输出吗?谢谢!

    current = new Node(data);

如果当前为空,这实际上是

null = 新节点(数据);

这是一个错误,link 您的列表中没有。

null 不是您列表的末尾, 指向 null 的节点是结束(不是 null)。

你必须找到并坚持下去。

这条语句:

current = new Node(data);

...不改变列表。它只是将一个新节点存储在 变量 中。但该列表不受该分配的影响。为了 添加 一个节点到非空列表,你必须更新节点的 next 属性,更具体地说,尾节点。但这里的重要区别在于分配给局部变量(不影响列表)和分配给已经在列表中的节点的属性(确实影响列表) .

所以代码的工作必须是找到尾节点。这就是循环的用途。错误的代码超出了最后一个节点,因此在循环退出时没有对尾节点的引用。因此——两手空空——无法将新节点分配给尾节点的 next 属性。