【问题标题】:Understanding how to reverse a Linked List? [duplicate]了解如何反转链接列表? [复制]
【发布时间】:2013-11-09 07:03:27
【问题描述】:

我有以下代码用于反转链表:

node old = head;
head = null;

while (old!=null) {
   node temp = old.link;
   old.link = head;
   head = old;
   old = temp;
}

谁能解释一下这段代码的每一行,因为我试图通过绘制箱形图来看看它是如何颠倒列表的,但我还是不明白。

【问题讨论】:

  • 这个问题可能会被关闭,但如果你真的不厌其烦地画出方框(拍照)并提出一个具体的问题,你将有更好的机会得到你可以学习的答案来自的东西。
  • 假设你有一个列表35 -> 42 -> 7 -> 80 现在你能弄清楚循环中的变量会发生什么吗?
  • 绘制更多图表。或者,更好的是,在每次迭代后写出每个变量的状态,包括与什么相关联的内容。从 4-5 个元素的列表开始。
  • 我在重新绘制图表后想通了。谢谢!!
  • @AayushK :我刚刚注意到,在您之前的一个问题中,有人建议您遵循适当的 Java 命名约定。我觉得我应该再次向您建议,Java 中的所有类名都应该以大写字母开头(Node 而不是node)。变量名称应以小写字母开头,每个后续单词大写 (Camel Case),如下所示:linkedListthisIsCamelCase

标签: java linked-list


【解决方案1】:

假设head是一个指向列表头的指针(1、2、3、4):

+-----+ link +-----+ link +-----+ link +-----+ link
|  1  | ---> |  2  | ---> |  3  | ---> |  4  | ---> null
+-----+      +-----+      +-----+      +-----+
 ^ head

节点老=头;
头=空;

+-----+ link +-----+ link +-----+ link +-----+ link
|  1  | ---> |  2  | ---> |  3  | ---> |  4  | --->  null
+-----+      +-----+      +-----+      +-----+
 ^ old

                                                     null

                                                      ^ head

while 循环的第一次迭代...)
节点 temp = old.link;

+-----+ link +-----+ link +-----+ link +-----+ link
|  1  | ---> |  2  | ---> |  3  | ---> |  4  | --->  null
+-----+      +-----+      +-----+      +-----+
 ^ old        ^ temp

                                                     null

                                                     ^ head

old.link = head;

+-----+ link +-----+ link +-----+ link +-----+ link
|  1  | -+   |  2  | ---> |  3  | ---> |  4  | --->  null
+-----+  |   +-----+      +-----+      +-----+
 ^ old   |    ^ temp
         |                            
         +---------------------------------------->  null

                                                     ^ head

头 = 旧的;

+-----+ link +-----+ link +-----+ link +-----+ link
|  1  | -+   |  2  | ---> |  3  | ---> |  4  | --->  null
+-----+  |   +-----+      +-----+      +-----+
 ^ old   |    ^ temp
 ^ head  |                             
         +---------------------------------------->  null

旧 = 温度;

             +-----+ link +-----+ link +-----+ link
             |  2  | ---> |  3  | ---> |  4  | --->  null
             +-----+      +-----+      +-----+
              ^ old
              ^ temp                   +-----+
                                       |  1  | --->  null
                                       +-----+
                                        ^ head

(第二次迭代...)
节点 temp = old.link;

             +-----+ link +-----+ link +-----+ link
             |  2  | ---> |  3  | ---> |  4  | --->  null
             +-----+      +-----+      +-----+
              ^ old        ^ temp
                                       +-----+ link
                                       |  1  | --->  null
                                       +-----+
                                        ^ head

old.link = head;

             +-----+ link +-----+ link +-----+ link
             |  2  | -+   |  3  | ---> |  4  | --->  null
             +-----+  |   +-----+      +-----+
              ^ old   |    ^ temp
                      |                +-----+ link
                      +--------------> |  1  | --->  null
                                       +-----+
                                        ^ head

头 = 旧的;

             +-----+ link +-----+ link +-----+ link
             |  2  | -+   |  3  | ---> |  4  | --->  null
             +-----+  |   +-----+      +-----+
              ^ old   |    ^ temp
              ^ head  |                +-----+ link
                      +--------------> |  1  | --->  null
                                       +-----+

旧 = 温度;

                          +-----+ link +-----+ link
                          |  3  | ---> |  4  | --->  null
                          +-----+      +-----+
                           ^ old
                           ^ temp

                          +-----+ link +-----+ link
                          |  2  | ---> |  1  | --->  null
                          +-----+      +-----+
                           ^ head

重复直到old指向最后的null(即,直到原始列表为空)。

【讨论】:

  • 这是您手工完成的吗?我印象深刻! +1
  • +1 LOL - 现在使用双向链表 :)))
  • @alfasin - 实际上,双向链表是微不足道的。
  • @HotLicks 是的,但它仍然很有趣 :)
  • @alfasin - 早些时候我注意到,在“类似”问题的侧边栏列表中,有一个是“如何反转双向链表”。
【解决方案2】:
       +-----+   +-----+   +-----+
head-->|     |-->|     |-->|     |-->null
       |  A  |   |  B  |   |  C  |
       |     |   |     |   |     |
       +-----+   +-----+   +-----+


node old = head
       +-----+   +-----+   +-----+
head-->|     |-->|     |-->|     |-->null
       |  A  |   |  B  |   |  C  |
       |     |   |     |   |     |
       +-----+   +-----+   +-----+
         ^^^
         old

head = null
       +-----+   +-----+   +-----+
head   |     |-->|     |-->|     |-->null
vvvv   |  A  |   |  B  |   |  C  |
null   |     |   |     |   |     |
       +-----+   +-----+   +-----+
         ^^^      ^^^^
         old      temp


node temp = old.link
       +-----+   +-----+   +-----+
head   |     |-->|     |-->|     |-->null
vvvv   |  A  |   |  B  |   |  C  |
null   |     |   |     |   |     |
       +-----+   +-----+   +-----+
         ^^^      ^^^^
         old      temp

old.link = head
       +-----+   +-----+   +-----+
head   |     |   |     |-->|     |-->null
vvvv   |  A  |   |  B  |   |  C  |
null<--|     |   |     |   |     |
       +-----+   +-----+   +-----+
         ^^^      ^^^^
         old      temp

head = old
       +-----+   +-----+   +-----+
head-->|     |   |     |-->|     |-->null
       |  A  |   |  B  |   |  C  |
null<--|     |   |     |   |     |
       +-----+   +-----+   +-----+
         ^^^      ^^^^
         old      temp

Rearranging slightly
old = temp
       +-----+
       |     |
       |  A  |
head-->|     |-->null
       +-----+
       +-----+   +-----+
 old-->|     |-->|     |-->null
       |  B  |   |  C  |
       |     |   |     |
       +-----+   +-----+
        ^^^^
        temp
Note that A is now a valid (if short) linked list.


node temp = old.link
       +-----+
       |     |
       |  A  |
head-->|     |-->null
       +-----+
       +-----+   +-----+
 old-->|     |-->|     |-->null
       |  B  |   |  C  |
       |     |   |     |
       +-----+   +-----+
                  ^^^^
                  temp

old.link = head
       +-----+
       |     |
       |  A  |
head-->|     |-->null
       +-----+
          ^
          |
       +-----+   +-----+
 old-->|     |   |     |-->null
       |  B  |   |  C  |
       |     |   |     |
       +-----+   +-----+
                  ^^^^
                  temp

head = old
       +-----+
       |     |
       |  A  |
       |     |-->null
       +-----+
          ^
          |
       +-----+   +-----+
 old-->|     |   |     |-->null
       |  B  |   |  C  |
head-->|     |   |     |
       +-----+   +-----+
                  ^^^^
                  temp

Rearrange,
old = temp
       +-----+   +-----+
       |     |   |     |
       |  B  |   |  A  |
head-->|     |-->|     |-->null
       +-----+   +-----+


       +-----+
 old-->|     |-->null
       |  C  |
       |     |
       +-----+
        ^^^^
        temp
Guess what? The sub-list A-B is now a valid list B-A.

node temp = old.link
       +-----+   +-----+
       |     |   |     |
       |  B  |   |  A  |
head-->|     |-->|     |-->null
       +-----+   +-----+


       +-----+
 old-->|     |-->null
       |  C  |    ^
       |     |    |
       +-----+    |
                  |
                 temp

old.link = head;
       +-----+   +-----+
       |     |   |     |
       |  B  |   |  A  |
head-->|     |-->|     |-->null
       +-----+   +-----+
          ^
          |
       +-----+
 old-->|     |-->null
       |  C  |    ^
       |     |    |
       +-----+    |
                  |
                 temp

head = old;
       +-----+   +-----+
       |     |   |     |
       |  B  |   |  A  |
       |     |-->|     |-->null
       +-----+   +-----+
          ^
          |
       +-----+
 old-->|     |   null
       |  C  |    ^
head-->|     |    |
       +-----+    |
                  |
                 temp

old = temp;
       +-----+   +-----+   +-----+
       |     |   |     |   |     |
       |  C  |   |  B  |   |  A  |
head-->|     |-->|     |-->|     |-->null
       +-----+   +-----+   +-----+

old-->null<--temp

Old is null, break out of the loop, we're done!

【讨论】:

    【解决方案3】:

    有助于画出每一行代码发生的事情

    希望你能遵循这一点,我将每一行代码编号为循环 1-3,然后在循环内为 A、B、C、D,如下所示:

    1. Node old = head;
    2. head = null;
    
    3. while (old!=null) {
    A.    Node temp = old.link;
    B.    old.link = head;
    C.    head = old;
    D.    old = temp;
       }
    

    编辑:哎呀,它把底部的图表剪掉了一点。 Head 应该指向新的第一个节点(图中的最后一个节点)。 Temp 和 Old 都应该为 Null。并且曾经是第一个的 Node 现在指向 Null,因为它现在是最后一个 Node。因此成功逆转。

    【讨论】:

    • 可能比我正在研究的 ascii 艺术怪物更好。
    • 哈哈我花了一段时间想弄清楚如何画它,然后我想起了笔和纸是什么!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    相关资源
    最近更新 更多