在《数据结构——链表(一)》一文中,我们介绍了链表的基本操作与实现,这篇文章我们来进一步学习链表的一些操作
链表进阶
判断单向链表是否有环
快慢指针法: 定义两个指针,通过两个指针的移动速度不同来实现功能,常用来寻找中间节点(快指针移动速度是慢指针的两倍,快指针移动到结尾时,慢指针刚好在中间)、判断单链表是否有环等操作。
利用快慢指针法判断单链表是否有环的代码实现如下:
public boolean hasCircle() {
if (header == null) return false;
if (tail == null) return false;
Node<T> fast = header;
Node<T> slow = header;
do {
if (fast == null) return false;
fast = fast.next;
if (fast == null) return false;
fast = fast.next;
slow = slow.next;
} while (fast != slow);
return true;
}
单链表反转
单链表反转的实现有多种方法,这里主要介绍四种:迭代反转法、递归反转法、头插入反转法以及就地逆置反转法。
迭代反转链表
该方法就是借助三个节点(beg、mid、end),让mid节点从当前链表的头节点开始,一直遍历至链表的最后一个节点,这期间会逐个改变所遍历到的节点的指针域,令其指向前一个节点,直至 mid 指向链表中最后一个节点。
- 初始定义三个节点(beg、mid、end)并初始化
在上图的基础上,遍历链表的过程就等价为:3 个指针每次各向后移动一个节点,直至 mid 指向链表中最后一个节点(此时 end 为 NULL )。需要注意的是,这 3 个指针每移动之前,都需要做一步操作,即改变 mid 所指节点的指针域,令其指向 beg。
- 改变 mid 所指节点的指针域
- 将3 个指针各向后移动一个节点
- 直至 mid 指向链表中最后一个节点,此时end指向NULL
- 最后只需改变 head 头指针的指向,另其和 mid 相同,就实现了链表的反转。
Java代码实现如下:
public void reverseLinkedListIteration() {
if (header == null) return;
if (header.