为什么这个链表插入代码有效,而另一个代码没有?

时间:2017-01-07 17:00:36

标签: java

我在Java中学习链接列表,但我不明白为什么这不起作用:

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

虽然这很有效:

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

在两个代码中,实例化空端节点。为什么这不会产生相同的结果?

Node类如下:

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

3 个答案:

答案 0 :(得分:3)

在第一种情况下,您要创建一个新的Node但不能将其连接到任何地方,因此它将从列表中分离出来。

在第二种情况下,您要创建一个新的Node并将其连接到您的实际尾{{1}},因此它会附加到列表中。

这是一个图形表示:

linked list insert

答案 1 :(得分:0)

while (tail != null) tail = tail.next;

tail.next为空时,循环终止。

然后你这样做:

tail = new Node(data);

将最后一个非null next的{​​{1}}指针保留为空。

tail

答案 2 :(得分:-1)

将您的Node课程更改为以下内容。

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

如果要插入第一个节点,请将头设置为新节点。

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

你的第一个案例之所以不起作用的原因是因为下面的节点不是在它之后附加节点,而是你完全创建一个新节点并将它分配给你当前的指向节点。

while (tail != null) tail = tail.next;
        tail = new Node(data);