单链表反转(4 种算法实现)
已经对单链表以及它的用法有了一个完整的了解。在此基础上,本节再带领大家研究一个和单链表有关的问题,即如何实
现单链表的反转。
反转链表,又可以称为翻转或逆置链表,它们表达的是同一个意思。以图 1 所示的链表为例:
图 1 未反转的链表
图 1 未反转的链表
经过反转(翻转、逆置)后,得到的新链表如图 2 所示:
通过对比图 1 和 图 2 中的链表不难得知,所谓反转链表,就是将链表整体“反过来”,将头变成尾、尾变成头。那么,
如何实现链表的反转呢?
常用的
实现方案有 4 种,这里分别将它们称为迭代反转法、递归反转法、就地逆置法和头插法
。
值得一提的是,递归反转法更适用于反转不带头节点的链表
;其它 3 种方法既能反转不带头节点的链表,也能反转带头节点的链表。
本节将以图 1 所示,即
不带头节点的链表为例,给大家详细讲解各算法的实现思想
1、迭代反转链表
该算法的实现思想非常直接,就是从当前链表的首元节点开始,一直遍历至链表的最后一个节点,这期间会逐个改变所遍历到的节点的指针域,另其指向前一个节点。
具体的实现方法也很简单,借助 3 个指针即可。以图 1 中建立的链表为例,首先我们定义 3 个指针并分别命名为 beg、mid、end。它们的初始指
向如图 3 所示:
在上图的基础上,遍历链表的过程就等价为:
3 个指针每次各向后移动一个节点
,
直至 mid 指向链表中最后一个节点(此时 end 为 NULL )
。需要注意的是,这 3 个指针每移动之前,都需要做一步操作,即改变 mid 所指节点的指针域,另其指向和 beg 相同。