漫画:如何将一个链表“逆序”?

简介: 让我们从链表头部开始,建立三个临时节点的引用,分别为p1,p2,p3。它们分别指向头节点、第二个节点、第三个节点。

640.jpg640.jpg



—————  第二天  —————




640.jpg640.jpg640.jpg640.jpg640.jpg640.png


640.png640.jpg640.jpg


(现实里的小灰在刚入行的时候,面试官也问了我这个问题,当时小灰就傻傻的问面试官是单链表还是双链表?然后就没然后了......)




————————————


640.jpg640.jpg640.jpg640.jpg640.jpg640.png640.jpg640.jpg640.jpg640.png640.jpg


让我们从链表头部开始,建立三个临时节点的引用,分别为p1,p2,p3。它们分别指向头节点、第二个节点、第三个节点。


640.png

实现链表逆序的完整步骤如下:


1.以p2节点为视角,把p2节点原本指向p3的next指针倒转,指向p1。


640.png


2.三个临时节点引用p1,p2,p3分别向后移动一格位置。


image.gif640.png



3.重复第1步的工作,以p2节点为视角,把p2节点原本指向p3的next指针倒转,指向p1。


640.pngimage.gif


4.重复第2步的工作,三个临时节点引用p1,p2,p3分别向后移动一格位置。


image.gif


640.png

.......

.......


5.继续像这样子迭代下去,一直到p2是空为止。


image.gif640.png


6.最后,把head节点的next指向空,成为逆序链表的尾节点。并且把p1赋值给head,让p1所在的节点成为逆序链表的头节点。


image.gif

image.gif640.png640.jpg

image.gif

private
static
Node
 head
;
public
static
void
 reverseLinkedList
(){
if
(
head
==
null
||
 head
.
next
==
null
){
return
;
}
Node
 p1 
=
 head
;
Node
 p2 
=
 head
.
next
;
Node
 p3 
=
null
;
while
(
p2
!=
null
){
        p3 
=
 p2
.
next
;
        p2
.
next
=
 p1
;
        p1 
=
 p2
;
        p2 
=
 p3
;
}
    head
.
next
=
null
;
    head 
=
 p1
;
}
private
static
class
Node
{
int
 data
;
Node
next
;
Node
(
int
 data
)
{
this
.
data 
=
 data
;
}
}
public
static
void
 main
(
String
[]
 args
){
//初始化链表
    head 
=
new
Node
(
3
);
    head
.
next
=
new
Node
(
5
);
Node
 temp 
=
 head
.
next
;
    temp
.
next
=
new
Node
(
1
);
    temp 
=
 temp
.
next
;
    temp
.
next
=
new
Node
(
4
);
    temp 
=
 temp
.
next
;
    temp
.
next
=
new
Node
(
9
);
//逆序前输出链表
    temp 
=
 head
;
while
(
temp
!=
null
){
System
.
out
.
println
(
temp
.
data
);
        temp 
=
 temp
.
next
;
}
//逆序链表
    reverseLinkedList
();
//逆序后输出链表
    temp 
=
 head
;
while
(
temp
!=
null
){
System
.
out
.
println
(
temp
.
data
);
        temp 
=
 temp
.
next
;
}
}


链表反转的逻辑本身,都在reverseLinkedList方法当中。在这里我们把链表的头节点作为了静态成员,实际上也可以作为方法参数传入,只是逻辑上需要一些小小的修改。

640.jpg640.jpg640.jpg


image.gif


相关文章
数据结构实验之链表二:逆序建立链表
数据结构实验之链表二:逆序建立链表
|
算法
算法基础~链表~从位置m到n逆序
算法基础~链表~从位置m到n逆序
101 0
算法基础~链表~从位置m到n逆序
|
存储 算法
算法基础~链表【将链表逆序题(不可申请额外的空间)~头插法】
算法基础~链表【将链表逆序题(不可申请额外的空间)~头插法】
121 0
算法基础~链表【将链表逆序题(不可申请额外的空间)~头插法】
|
Java 存储
面试:用 Java 逆序打印链表
面试:用 Java 逆序打印链表 昨天的 Java 实现单例模式 中,我们的双重检验锁机制因为指令重排序问题而引入了 volatile 关键字,不少朋友问我,到底为啥要加 volatile 这个关键字呀,而它,到底又有什么神奇的作用呢? 对 volatile 这个关键字,在昨天的讲解中我们简单说了一下:被 volatile 修饰的共享变量,都会具有下面两个属性: 保证不同线程对该变量操作的内存可见性。
1257 0
|
存储 算法
<算法>图解逆序单向链表全过程
4个桶, 桶上都分别标着特定的标签1, 2, 3, 4; 桶里有对应的4个球,标着和桶一样的编号; 问题来了, 让所有桶和桶内球的编号之和都为5, 在交换的过程中,不能增加额外的桶, 且球不能着地,应该如何解决呢,最好的方式就是多找几个人,手持球完成...
1016 0