这个链表反向实现如何工作?

时间:2012-06-25 01:50:47

标签: java list linked-list

我想了解反向LinkedList代码如何在...下面运行

public void reverse(Node<T> h) {
  Node<T> d = new Node<T>();
  Node<T> t;
  while (h.next != null) {
     t = h.next; //temp nodes points to h.next (1st item in list)
     h.next = t.next; //h.next bypasses first node in list.
     t.next = d.next; //t.next points to d.next.. where is d.next pointing to?
     d.next = t; //d.next now points to t.
  }
   h.next = d.next;
  }

这个过程如何运作?

图表会很棒。似乎一个列表中的节点被弹出并推入一个新列表?在这种情况下,h是否指向要反转的列表?

1 个答案:

答案 0 :(得分:1)

更新自己,以及挑战的修改:

该算法确实有效,它只是以令人困惑的方式编写而包含第一个节点(它仅用于副作用),这是一个......有问题的设计本身。

重写它以避免无用d.next并使t范围更好,使我更容易(并且可能对我来说):

public void reverse(Node<T> h) { // draw H under first node
  Node<T> d = null
  while (h.next != null) {
     Node<T> t = h.next;  // draw T under box at end of H arrow (remove any previous T)
     h.next = t.next;     // change arrow from H to end where arrow from box above T ends (no arrow for last element)
     t.next = d;          // draw arrow from box above T to box D is under (no arrow for first element)
     d = t;               // draw D under box (remove any previous D)
   }
   h.next = d;            // draw arrow from H to box D is under
}

开箱即用!

(我建议查看Reverse a Linked-List处的代码,它是相同的概念,但更容易遵循,并且没有此实现的假头节点。)


我知道我说“只是画盒子”。所以,在你的一些评论之后,我画了一下方框。 (我假装我回到了大学; - )

然而,我无法让它工作。我甚至试过圈子。

我怀疑发布的代码是而不是一个正在运行的实现(现在对其他人来说现在是一个公开的挑战,现在证明我错了;至少它可能会让这个问题保持开放; - )

在多次尝试之后,我无法使用它来反转长度为2,3或4个元素的列表(尽管我已经能够成功使用{{更直观]的代码。 3}})。

我认为使用h.next代替h作为“根”节点存在缺陷。也许作者会假设void返回虚假节点和副作用?但在这种情况下,行h.next = t.next似乎仍然打破了算法。