[数据结构——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题。

相关推荐
kaikaile199512 分钟前
基于拥挤距离的多目标粒子群优化算法(MO-PSO-CD)详解
数据结构·算法
不忘不弃23 分钟前
求两组数的平均值
数据结构·算法
leaves falling24 分钟前
迭代实现 斐波那契数列
数据结构·算法
DonnyCoy1 小时前
Android性能之数据结构
数据结构
天赐学c语言1 小时前
1.7 - 删除排序链表中的重要元素II && 哈希冲突常用解决冲突方法
数据结构·c++·链表·哈希算法·leecode
菜鸟233号2 小时前
力扣96 不同的二叉搜索树 java实现
java·数据结构·算法·leetcode
空空潍2 小时前
hot100-最小覆盖字串(day12)
数据结构·算法·leetcode
yyy(十一月限定版)3 小时前
算法——二分
数据结构·算法
啊董dong3 小时前
noi-2026年1月07号作业
数据结构·c++·算法·noi
星火开发设计4 小时前
二叉树详解及C++实现
java·数据结构·c++·学习·二叉树·知识·期末考试