【问题标题】: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

【问题讨论】:

  • “代码会出错”——这是什么意思?请发帖minimal reproducible example
  • 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.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多