【问题标题】:Reversing a Linked List (Help)反转链接列表(帮助)
【发布时间】:2018-02-09 22:29:52
【问题描述】:

所以 ListNodes 真的让我很困惑,我一直在尝试理解代码的 sn-ps 以了解它们是如何工作的,但是我无法理解以下反向函数,尤其是 while 循环,有人可以向我解释一下吗.

// Definition for singly-linked list:
// class ListNode<T> {
//   ListNode(T x) {
//     value = x;
//   }
//   T value;
//   ListNode<T> next;
// }
//

ListNode<Integer> reverse(ListNode<Integer> l) {
    if(l==null||l.next==null)
        return l;

    ListNode<Integer> p1 = l;
    ListNode<Integer> p2 = p1.next;

    l.next = null;

    while(p1!=null&& p2!=null){
        ListNode<Integer> t = p2.next;
        p2.next = p1;
        p1 = p2;
        p2 = t;
    }

    return p1;

}

【问题讨论】:

  • 这是什么语言?
  • @OmegaNalphA 它是 java

标签: linked-list reverse singly-linked-list


【解决方案1】:

本质上,他们创建了一个临时变量 t 来保存 p2 指向的额外值,在 p1 和 p2 之间切换指针,然后使新的 p2 指向该临时变量。由于他们已经声明 p2.next 指向 p1,因此即使 p2 在下一行替换它,它也从未被删除。

虽然它的写法有点奇怪,但我通常看到它的指针是随机排列的,而不是这里显示的方式。

【讨论】:

  • 我不明白的是临时变量t如何能够保持p2.next的初始值。例如,当 ListNode p1 = l 然后我们使 l.next = null 时,这也会导致 p1.next = null。因此,如果我们要更改 p2.next = p1,这不也意味着 ListNode t = p1 吗?
  • 我很确定在这种情况下它正在复制值,因为在 java 中它们并不真正处理指针,因此它是位于 p2.next 中的对象的副本。您可以检查的一件事是每次执行发生时打印 t 和 p2.next 的值(例如,在每个递增的节点中插入一个字符串)并查看发生了什么/它如何变化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多