[Algorithm] List
链表问答
资源
Ref: [算法总结] 一文搞懂面试链表题
Quiz
一、第一波攻击
在 O(1) 时间删除链表节点 - 单向链表
做一次复制即可。
如果我们把下一个节点的内容复制到要删除的节点上覆盖原有的内容,再把下一个节点删除,那就相当于把当前要删除的节点删除了。
反转链表 O(n)
用三个临时指针 prev、cur、next 在链表上循环一遍即可。
旋转部分单链表以及删除单链表倒数第 n 个节点
rorate是一个链表操作术语.
快指针结合慢指针,相同步幅走;
关键是找到头节点.
求单链表的中间节点
快指针结合慢指针,不同步幅走
链表划分,大于x的排后面;小于x的排前面(partition操作)
初始化两个链表leftList, rightList,遍历原链表。
在O(nlogn)时间内对单链表进行排序
快排或者并归 --> Goto: 排序章节
快排之殇
但是在处理相对有序的数据时时间复杂度最坏能退化到 O(n²) ,而为了避免这种情况,需要一些额外的技巧,减小分割时取值过于极端的情况发生。
在快速排序时,需要有两个指针分别从数据首尾向中间结点移动,这对单链表来说不很方便。
归并之巧
因此这里首要考虑使用归并排序。主要考察3个知识点,
- 知识点1:归并排序的整体思想
- 知识点2:找到一个链表的中间节点的方法(分割)
- 知识点3:合并两个已排好序的链表为一个新的有序链表(合并)
合并两个排序的链表
同步指针法
判断单链表是否存在环
快慢指针,慢指针每次移动一步,快指针每次移动两步,如果存在环,那么两个指针一定会在环内相遇。
找到环的入口点
我们设置两个指针,一个是快指针fast,一个是慢指针slow,fast一次走两步,slow一次走一步,如果单链表有环那么当两个指针相遇时一定在环内。
此时将一个指针指到链表头部,另一个不变,二者同时每次向前移一格,当两个指针再次相遇时即为环的入口节点。如果fast走到null则无环。
判断两个无环单链表是否相交
尾巴必然一样;
或者用”有环“的思想去解题。
求两个无环单链表的第一个相交点
妙哉,四种方法四个角度:
-
- 方法一 [倒转链表可以用”栈“] 如果两个链表存在公共结点,那么它们从公共结点开始一直到链表的结尾都是一样的,因此我们只需要从链表的结尾开始,往前搜索,找到最后一个相同的结点即可。但是题目给出的单向链表,我们只能从前向后搜索,这时,我们就可以借助栈来完成。先把两个链表依次装到两个栈中,然后比较两个栈的栈顶结点是否相同,如果相同则出栈,如果不同,那最后相同的结点就是我们要的返回值。
- 方法二 [利用尾部共享] 先找出2个链表的长度,然后让长的先走两个链表的长度差,然后再一起走,直到找到第一个公共结点。
- 方法三 [环的入口点] 由于2个链表都没有环,我们可以把第二个链表接在第一个链表后面,这样就把问题转化为求环的入口节点问题。
- 方法四 [互补长度一致策略] 两个指针p1和p2分别指向链表A和链表B,它们同时向前走,当走到尾节点时,转向另一个链表,比如p1走到链表 A 的尾节点时,下一步就走到链表B,p2走到链表 B 的尾节点时,下一步就走到链表 A,当p1==p2 时,就是链表的相交点
判断两个有环单链表是否相交
如果两个有环单链表相交,那么它们一定共有一个环,即环上的任意一个节点都存在于两个链表上。
复杂链表的复制
题目描述:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为:复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
第二个指针如何复制的问题?
复制操作可以分成两个部分:
* 复制正常的链表指针域
这个操作比较简单,因为链表的下一个指针为形成一个串的,我们从头开始即可遍历所有的结点
* 复制随机的指针域
这个操作有点麻烦,由于指针是随机指向的,因此无法通过一趟遍历来实现.
(1) 采用暴力的方式,
由于指针的位置是一一对应的,我们查找到原来的随机指针域在新链表中对应位置(O(N)O(N)),而我们遍历一遍将所有的随机指针都复制则需要O(N2)
(2) 奇偶复制。这样,random指针指向的结点自然知道”自己的copy"的位置。
二、第二波攻击
/* todo */
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律