[数据结构——lesson5.1链表的应用]

引言

上节内容我们讲到单链表和双向链表的功能与实现方法,这节为了更好的理解链表,我们主要学习链表的算法题目和应用

学习目标:链表OJ题

  1. 移除链表元素
  2. 反转链表
  3. 合并两个有序链表
  4. 链表的中间节点
  5. 环形链表的约瑟夫问题
  6. 分割链表
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)

将小链表的尾节点和大链表的第一个有效节点首尾相连

注意,虽然题目给出的是不需要 保留 每个分区中各节点的初始相对位置。但是我们这里考虑了保留 每个分区中各节点的初始相对位置

结束语:本节我们学习了关于链表的一些OJ题。

相关推荐
夏鹏今天学习了吗3 小时前
【LeetCode热题100(31/100)】K 个一组翻转链表
算法·leetcode·链表
Pluchon4 小时前
硅基计划4.0 算法 字符串
java·数据结构·学习·算法
麦格芬2304 小时前
LeetCode 416 分割等和子集
数据结构·算法
2401_841495648 小时前
【数据结构】顺序表的基本操作
数据结构·c++·算法·顺序表·线性表·线性结构·顺序表的基本操作
自信的小螺丝钉8 小时前
Leetcode 138. 随机链表的复制 哈希 / 拼接+拆分
leetcode·链表·哈希算法
未知陨落9 小时前
LeetCode:70.最小栈
数据结构·算法·leetcode
小糖学代码9 小时前
STL的list模拟实现(带移动构造和emplace版本)
c语言·数据结构·c++·windows·list
shenghaide_jiahu9 小时前
leetcode430:扁平化多级双向链表
数据结构·链表
失散139 小时前
软件设计师——03 数据结构(上)
数据结构·软考·软件设计师
Chance_to_win9 小时前
数据结构之双向链表
数据结构·链表