以下是如何可视化链接列表1→2→3的逆转:
我们从以下几个方面开始:
head
│
┌─┴─────────┐ ┌───────────┐ ┌───────────┐
│ val: 1 │ │ val: 2 │ │ val: 3 │
│ next: ────────┤ next: ────────┤ next: None│
└───────────┘ └───────────┘ └───────────┘
第一个递归调用接收head.next
,并将有自己的本地名称.为了将这些本地名称与我们在reverseList
的原始执行中已经读到的名称区分开来,我将在名称中添加重音符号,其中Accens的数量表示递归深度.因此,在第一次递归调用时,我们可以将情况可视化为:
head head'
│ │
┌─┴─────────┐ ┌─┴─────────┐ ┌───────────┐
│ val: 1 │ │ val: 2 │ │ val: 3 │
│ next: ────────┤ next: ────────┤ next: None│
└───────────┘ └───────────┘ └───────────┘
在第二级递归调用中:
head head' head'' newHead''
│ │ │ │
┌─┴─────────┐ ┌─┴─────────┐ ┌─┴──────┴──┐
│ val: 1 │ │ val: 2 │ │ val: 3 │
│ next: ────────┤ next: ────────┤ next: None│
└───────────┘ └───────────┘ └───────────┘
这个二级递归执行不会进入if
块,只会将head''
的next
属性设置为None
(它已经这样做了)并返回newHead''
.
返回第一次返回的引用赋值为newHead'
的递归执行,因此我们得到以下结果:
head head' newHead'
│ │ │
┌─┴─────────┐ ┌─┴─────────┐ ┌─┴─────────┐
│ val: 1 │ │ val: 2 │ │ val: 3 │
│ next: ────────┤ next: ────────┤ next: None│
└───────────┘ └───────────┘ └───────────┘
在这个递归执行中,这是我们第一次执行head.next.next = head
,作用于head'
.因此,我们得到:
head head' newHead'
│ │ │
┌─┴─────────┐ ┌─┴─────────┐ ┌─┴─────────┐
│ val: 1 │ │ val: 2 │ │ val: 3 │
│ next: ────────┤ next: ────────┤ next: ┐ │
│ │ │ ├───────────┘ │
└───────────┘ └───────────┘ └───────────┘
然后head'
的next
属性得到None
:
head head' newHead'
│ │ │
┌─┴─────────┐ ┌─┴─────────┐ ┌─┴─────────┐
│ val: 1 │ │ val: 2 │ │ val: 3 │
│ next: ────────┤ next: None│ │ next: ┐ │
│ │ │ ├───────────┘ │
└───────────┘ └───────────┘ └───────────┘
最后,第一次递归执行返回newHead'
.
原始执行接收此引用并将其分配给自己的newHead
:
head newHead
│ │
┌─┴─────────┐ ┌───────────┐ ┌─┴─────────┐
│ val: 1 │ │ val: 2 │ │ val: 3 │
│ next: ────────┤ next: None│ │ next: ┐ │
│ │ │ ├───────────┘ │
└───────────┘ └───────────┘ └───────────┘
同样,执行head.next.next = head
:
head newHead
│ │
┌─┴─────────┐ ┌───────────┐ ┌─┴─────────┐
│ val: 1 │ │ val: 2 │ │ val: 3 │
│ next: ────────┤ next: ┐ │ │ next: ┐ │
│ ├───────────┘ ├───────────┘ │
└───────────┘ └───────────┘ └───────────┘
最后,将head.next
设置为None
,并返回newHead
:
(returned)
│
┌───────────┐ ┌───────────┐ ┌─┴─────────┐
│ val: 1 │ │ val: 2 │ │ val: 3 │
│ next: None│ │ next: ┐ │ │ next: ┐ │
│ ├───────────┘ ├───────────┘ │
└───────────┘ └───────────┘ └───────────┘
...这是颠倒了的名单.
希望这能澄清这一点.