【问题标题】:java- where does a pointer points to if I dont declare it to nulljava-如果我不将指针声明为null,指针指向哪里
【发布时间】:2018-04-27 20:53:13
【问题描述】:
当我在 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?
【问题讨论】:
-
-
track.next = null 不是声明。这是一个赋值,所以如果你删除它,值不会被修改,即保留它已经拥有的值。由于track是新的“last”节点,它曾经是“first”节点,它曾经指向“second”节点,所以如果不修改,它仍然会指向曾经是“second”的节点" 节点,现在是“倒数第二”节点,从而在最后两个节点之间创建一个循环。简单的调试会告诉你,所以...idownvotedbecau.se/nodebugging
标签:
java
pointers
linked-list
【解决方案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
【解决方案2】:
嗯,你正在反转一个链接列表。
假设列表是 a-> b-> c
你把它们藏起来了。
现在您将它们反向弹出并设置指针。
所以,c->b->a (---> 这是指向 b 的 a 指针的旧值)
我们需要 c->b->a->null
这就是为什么需要track.next = null;。
如果我们不使用它怎么办?
那么逆向形成的链表就是
c -> b -> a
| ___| (a pointing back to b)
这就是为什么任何其他访问这种反向链表的代码都会发生故障。
【解决方案3】:
如果我理解正确,你正在反转一个链表,首先从它的头部开始将元素推入堆栈,然后从堆栈中弹出元素,以相反的顺序重新创建链接。反向列表的最后一个节点将是原始列表的第一个节点。所以将反向列表的尾部设置为空。
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.