当我在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
?
答案 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.