[数据结构——lesson5.1链表的应用]
引言
上节内容我们讲到单链表和双向链表的功能与实现方法,这节为了更好的理解链表,我们主要学习链表的算法题目和应用
学习目标:链表OJ题
- 移除链表元素
- 反转链表
- 合并两个有序链表
- 链表的中间节点
- 环形链表的约瑟夫问题
- 分割链表
1.移除链表元素
OJ题移除链表元素
思路1:遍历原链表
思路2:找值不为val的节点,尾插到新链表中(创建新链表)
2.反转链表
思路一:创建新链表,将原链表中的节点拿过来头插。
思路二:创建三个指针,完成原链表的翻转。
OJ题反转链表
3.合并两个有序链表
OJ题合并两个有序链表
思路:创建新的空链表,遍历原链表,将节点小的放在新链表中尾插操作
4.链表的中间节点
OJ题链表的中间节点
思路1:遍历count记录节点数,返回(count/2)节点的next节点。
思路2:快慢指针。slow每走一步,fast走两步
但是要注意节点数奇偶数不同情况(中间节点)也很会有所不同。
所以我们要判断条件为(fast&&fast->next)
5.环形链表的约瑟夫问题
OJ题环形链表的约瑟夫问题
约瑟夫问题
设编号为1,2,…n的n个人围成一个圈,约定编号为k(1<=k<=n)的人从1开始保数,数到m的那个人出列,它的下一位又从1开始报数,数到m的人又出列,依次类推,直到所有人出列为止,由此产生一个出对编号的序列
思路:使用一个不带头节点的环形链表,先构成一个又n个节点的单向循环链表,然后由k节点从1开始计数,计到m时,对应节点从链表中删除,然后再往下计数直到链表为空
依次进行
6.分割链表
OJ题分割链表
思路1:prev、pcur、ptail、newptail四指针尾插
思路2:创建新链表(哨兵位)
- 若pcur节点的值小于x,头插在新链表中,
- 若pcur节点的值大于或等于x,尾插到NewTail中。
思路3:小链表(lessHead、lessTail),大链表(greater Head、greater Tail)
将小链表的尾节点和大链表的第一个有效节点首尾相连
注意,虽然题目给出的是不需要 保留 每个分区中各节点的初始相对位置。但是我们这里考虑了保留 每个分区中各节点的初始相对位置