单链表的反转,我们能想到反转顺序最简单的数据结构就是栈了,如果可以用栈的话,那问题就简单了。顺序遍历单链表,依次入栈直到遍历结束,然后依次出栈重新有前到后连接为一个新的单链表,则自动实现了反转功能。
栈实现
1 | public class Solution { |
遍历实现
原理详解
digraph leetcode_92_1 {
bgcolor="#f7f7f7"
rankdir=LR
subgraph cluster_name {
subgraph cluster_1 {
n0 [label="newEnd" shape=circle,color=blue,fillcolor=white,style=filled,width=0.8,fixedsize=true]
n1 [label="..." shape=circle,color=blue,fillcolor=white,style=filled,width=0.8,fixedsize=true]
n2 [label="newHead" shape=circle,color=blue,fillcolor=white,style=filled,width=0.8,fixedsize=true]
n3 [label="node" shape=circle,color=red,style=dashed,width=0.8,fixedsize=true]
n4 [label="oldHead" shape=circle,color=blue,fillcolor=lightblue,style=filled,width=0.8,fixedsize=true]
n5 [label="..." shape=circle,color=blue,fillcolor=lightblue,style=filled,width=0.8,fixedsize=true]
n6 [label="oldEnd" shape=circle,color=blue,fillcolor=lightblue,style=filled,width=0.8,fixedsize=true]
rank=same;
n0 -> n1 -> n2[dir=back]
n2 -> n3[style=dashed,color="#f7f7f7"]
n3 -> n4[style=dashed,color=red]
n4 -> n5 -> n6
style=invis
}
}
label=<<B>图 1.1 遍历反转链表</B>>
}
代码实现
1 | public class Solution { |
递归实现
递归实现的原理和栈是类似的,因为递归本身就是利用了程序栈进行了压栈处理,因此好好理解一下第一种算法与第三种算法,有助于理解递归的原理。
1 | public class Solution { |