前言:Hello!大家好,我是@每天都要敲代码,前两期我们已经学习了链表(单链和双链),没有掌握的同学不妨先去学习一下:单链表和双链表;今天就带大家一起学习一下链表的几个经典例题,巩固一下所学的知识是否能灵活应用!
题目1:翻转链表
思路一:三个指针翻转===》循环迭代
什么意思呢?就是把指针的方向翻过来;例如:1—>2—>3—>NULL,通过翻转指针我们就会得到NULL<—1<—2<—3,有了简单的思路,下面不妨通过画图分析一波。
逻辑图:
第一步:
第二步:
第三步:
第四步:
具体代码:
根据我们上面的简单分析,我们就可以开始写出核心代码了:
思路二:头插法===》取节点头插到新链表
怎么理解呢?就是取原链表的节点,头插到新链表当中。有了思路,老规矩,我们还是通过画图先分析一波。
逻辑图:
第一步:
第二步:
第三步:
第四步:
具体代码:
根据我们上面的简单分析,我们就可以开始写出核心代码了:
题目2:链表的中间节点
给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。例如:
思路: 双指针===》快慢指针
我们不妨定义两个指针:一个慢指针slow,一个快指针fast ,这两个指针的起点是相同的,快指针fast每次都比慢指针slow走快一步。才开始都初始化等于头指针head;slow = head,fast = head;然后每次慢指针走一步:slow = slow->next;快指针走两步:fast = fast->next->next;有了思路我们先画图分析:
逻辑图:
第一种情况:对于偶数个数据
第二种情况:对于奇数个数据
具体代码:
根据我们上面的简单分析,我们就可以开始写出核心代码了:
题目3:合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的
思路:利用尾插
我们创建一个新的链表,然后把另外两个链表的数据,每次取最小值,依次尾插进来就可以了;下面画图分析一下:
逻辑图:
第一步:
第二步:
第三步:
第四步:
第五步:
第六步:
第七步:
具体代码:
根据我们上面的简单分析,我们就可以开始写出核心代码了: