如果我没有将它声明为null,那么指针指向哪里

时间:2018-04-27 20:53:14

标签: java pointers linked-list

当我在leetcode上做这个问题时:

class Solution {
    public ListNode reverseList(ListNode head) {
        Stack s = new Stack();

    ListNode curr = head;
    while (curr != null) {
        s.push(curr);
        curr = curr.next;
    }

    ListNode newHead = new ListNode(-1);
    ListNode track = newHead;
    while (!s.empty()) {
        track.next =(ListNode) (s.pop());
        track = track.next;
    }
    track.next = null;

    return newHead.next;
    }
}

如果我没有track.next = null,则代码运行错误。那将追踪什么。如果我没有声明它指向null

,则指向下一步

3 个答案:

答案 0 :(得分:1)

那是因为你给了track.next原始节点的引用,该引用已经分配了next值。请遵循此示例中的逻辑:

假设你有一个大小为3的ListNode,使用节点1作为根:

( 1 ) --> ( 2 ) --> ( 3 ) --> null

在您的实现中,您将每个节点都添加到堆栈中,如下所示:

节点 - > next

|  3      null |  <--- Top of stack
|  2        3  |
|  1        2  |

然后创建一个新节点newHead并开始从堆栈中弹出节点,将值分配给您的节点,如下所示:

( 3 )  -->  ( 2 )  -->  ( 1 ) --> ( 2 )

由于您尚未更新列表原始头部的track.next值,因此它仍指向节点2.但节点2现在指向节点1,因此您陷入了无限循环。通过最后调用track.next = null,您将上面的内容更改为:

( 3 ) --> ( 2 ) --> ( 1 ) --> null

答案 1 :(得分:0)

嗯,您正在撤消链接列表。 假设列表是a-&gt; B-&GT; ç

你把它们藏起来。 现在你反向弹出它们并设置指针。

所以,c-&gt; b-&gt; a(---&gt;这是一个指向b的指针的旧值)

我们需要c-&gt; b-&gt; a-&gt; null

这就是为什么track.next = null;是必需的。

如果我们不使用它会怎么样?

然后通过反转形成的链表将是

c - &gt; b - &gt;一个

   | ___|  (a pointing back to b)

这就是为什么访问这种反向链表的任何其他代码都会出现故障。

答案 2 :(得分:0)

如果我理解正确,你是通过首先将元素从头部开始向堆栈推送,然后从堆栈中弹出元素,以相反的顺序重新创建链接来反转链表。反向列表的最后一个节点将是原始列表的第一个节点。因此,将反向列表的尾部设置为空。

    ListNode newHead = new ListNode(-1);
    ListNode track = newHead;
    while (!s.empty()) {
        track.next =(ListNode) (s.pop());
        track = track.next;
    }
    #track is now pointing to the head (that was the first one pushed on to stack).
    track.next = null; # set the tail of reversed list to null.