1. 数据结构---链表

一、链表

双指针”法解决链表问题

背景:单链表问题由于顺序遍历的特性,有时候执行一些操作的时候会出现问题看似需要多次遍历才能获取数据。

使用双指针法能在一次遍历中获取更多的数据,也可以节约更多的额外控件。“双指针”就是用一个快指针一个慢指针同时进行单链表的顺序扫描。

如此就可以使用快指针的时间差给慢指针提供更多的操作信息。

下面是两个LeetCode下的习题:

(1)给定一个链表,删除链表的倒数第 个节点并返回头结点。

思路:构建先导指针,快于后续指针n-1步,先导指针指向链表尾部时候,慢指针就指向倒数第n个节点

(2)给定一个链表,判断链表中否有环。

传统思路:找个容器把出现的点存起来,出现重复点就判断成环(缺点很明显:额外内存占用)

双指针思路:快指针比慢指针先走,如果快指针被慢指针追上,说明进入闭环

二、算法

1.链表反转

思路:

1.头插法

2.递归

 

2.删除排序链表中重复的节点

题目:一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

  

3.两个链表的第一个公共节点

两个单链表相交分为三种情况:

  (1)一个有环,一个没环,两个链表不可能相交

  (2)两个都没有环,求相交点或者不相交

  (3)两个都有环,求相交点或者不相交

思路1:利用两个栈分布记录两个链表,然后一起弹出栈顶,比较是否相等,如果相等,就继续一起弹出,直到不相等为止,返回最后一次弹出的节点,即为第一个公共节点,时间复杂度O(m+n),空间复杂度O(m+n)

思路2:headA的长度为A+C(公共长度),headB的长度为B+C,所以当headA走完A+C时,再转过来走B;headB走完B+C时,再转过来走A; 当两个节点都走了A+B+C时,两个节点相遇,返回该节点 时间复杂度O(m+n),空间复杂度O(1)

  

4.从尾到头打印链表

题目:输入一个链表,按链表从尾到头的顺序返回一个ArrayList。

  

5.合并两个有序链表

时间复杂度O(N),空间复杂度O(1)

思路:

  1)首先将两个链表第一个值比较小的链表作为头结点,

  2)然后依次遍历两个链表的值,比较大小

  3)再把次链表的直接接到主链表上

  

6.复杂链表的复制

题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

思路1:第一步复制主链节点;第二步复制设置每个节点的m_pSibling节点 时间复杂度O(N2)

思路2:第一步复制主链节点,把<N,N'>配对信息放到哈希表中;第二步设置复制链表上的每个节点的m_pSibling,时间复杂度O(N),空间复杂度O(N)

思路3:第一步复制主链节点,把N'链接到N的后面;第二步设置复制出来的节点的m_pSibling;第三步长链表拆分成两个两个链表,空间复杂度O(1),时间复杂度O(N)

  

7.链表中倒数第k个节点

思路:快慢指针,第一个指针先走k步,然后第二个指针开始走,直到第一个指针下一跳为空,第二个指针所在的位置就是倒数第k个节点。相当于制造了一个k长度的尺子,把尺子从头往后移动,当尺子的右端与链表的末尾对齐的时候,尺子左端所在的结点就是倒数第k个结点

  

8.链表中环的入口节点

思路:

  1)先找快慢指针相遇的节点,这个节点肯定在环中;

  2)然后通过这个节点,找到环的长度;

  3)环的长度已知,可以设置快指针从头结点出发,先走环的长度的距离,再用慢指针,从头结点开始走,同时,快指针也开始走,两个指针相遇的地方就是环的入口位置

  

 

 

参考:

【1】Java实现单向链表

posted @   nxf_rabbit75  阅读(253)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
一、链表二、算法1.链表反转2.删除排序链表中重复的节点3.两个链表的第一个公共节点4.从尾到头打印链表5.合并两个有序链表6.复杂链表的复制7.链表中倒数第k个节点8.链表中环的入口节点
点击右上角即可分享
微信分享提示