数据结构——链表(二)

在《数据结构——链表(一)》一文中,我们介绍了链表的基本操作与实现,这篇文章我们来进一步学习链表的一些操作链表进阶判断单向链表是否有环快慢指针法: 定义两个指针,通过两个指针的移动速度不同来实现功能,常用来寻找中间节点(快指针移动速度是慢指针的两倍,快指针移动到结尾时,慢指针刚好在中间)、判断单链表是否有环等操作。利用快慢指针法判断单链表是否有环的代码实现如下:public boolean hasCircle() { if (header == null) return false;
摘要由CSDN通过智能技术生成

《数据结构——链表(一)》一文中,我们介绍了链表的基本操作与实现,这篇文章我们来进一步学习链表的一些操作

链表进阶

判断单向链表是否有环

快慢指针法: 定义两个指针,通过两个指针的移动速度不同来实现功能,常用来寻找中间节点(快指针移动速度是慢指针的两倍,快指针移动到结尾时,慢指针刚好在中间)、判断单链表是否有环等操作。

利用快慢指针法判断单链表是否有环的代码实现如下:

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 指向链表中最后一个节点。

  1. 初始定义三个节点(beg、mid、end)并初始化

迭代反转图1

在上图的基础上,遍历链表的过程就等价为:3 个指针每次各向后移动一个节点,直至 mid 指向链表中最后一个节点(此时 end 为 NULL )。需要注意的是,这 3 个指针每移动之前,都需要做一步操作,即改变 mid 所指节点的指针域,令其指向 beg。

  1. 改变 mid 所指节点的指针域

迭代反转图2

  1. 将3 个指针各向后移动一个节点

迭代反转图3

  1. 直至 mid 指向链表中最后一个节点,此时end指向NULL

迭代反转图4

  1. 最后只需改变 head 头指针的指向,另其和 mid 相同,就实现了链表的反转。

Java代码实现如下:

public void reverseLinkedListIteration() {
    if (header == null) return;
    if (header.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值