链表题目
题目1
单链表是否为回文结构#
方案一: 容器 (牺牲空间复杂度)
把这些元素从头开始放到栈中,结束以后依次弹出与第一个数相比较
方案二: 快慢指针
快指针一次走两步,慢指针一次走一步,当快指针为null时,我们找到了链表的尾部以及链表中间的位置
此时将中间位置的结点指向空,反转链表的右半部分,然后双指针,对比完将链表恢复
如果链表的结点为偶数,当快指针跳出时,慢指针就不动了,此时慢指针指向的就当作中间结点
题目2
将单向链表按某值划分成左边小、中间相等、右边大的形式#
方案一: 数组 (牺牲空间复杂度)
遍历链表到数组,之后再使用荷兰国旗
方案二: 使用额外变量
因为需要划分为3个区域,每个区域中设置两个变量分别为:头结点和尾结点,接下来遍历原链表,头结点和尾结点指向第一次符合要求的结点,之后将第一个符合要求的元素指向第二个符合要求的结点,将尾结点指向第二个结点,以此类推,最后将第一个区域的尾结点指向第二个区域的头结点,第二个区域的尾结点指向第三个区域的头结点。
复制含有随机指针的结点#
方案一: 哈希表
遍历一遍老链表,将老链表的结点映射到map的key,结束后再遍历老链表得到老链表的next和random,映射到map的value
方案二: 另一种摆放位置
遍历一遍链表后,将新结点放在每一个相对应的老结点的后面,利用一个新的结构的摆放,来代替哈希表,方便查找新结点的位置,再遍历老结点,新结点的random指向的是老结点random的下一个结点,即克隆结点相对应的结点。
两个单链表相交的一系列问题#
链表是否有环#
方案一: 哈希表
遍历链表并且set到map中,如果后续发现遍历的链表map中有,则链表是有环的,如果遍历到空,没有发现,则说明没有环
方案二: 快慢指针
- 快慢指针从头部出发,快指针一次走两步,慢指针一次走一步
- 如果快指针null,则无环; 如果一直没遇到null,则有环,如果有环,快指针则会在环上遇到慢指针
- 遇到后:快指针回到头部,一次走一步,慢指针在原地开始一次走一步
- 当两者再次遇到时,就是环的入口
两链表相交的问题#
头结点分别为head1,head2
分别取得两链表的入环结点
loop1
loop2
方案一: 哈希表
将链表一注册到哈希表,再遍历链表二
方案二:
遍历链表一,找到他的最后一个结点,并统计长度;链表二同上。如果两个链表相交,那么他们最后一个结点内存地址一定相同。如果相同,那么这是他们相交部分最后一个结点,那怎么求第一个相交结点呢?让长链表先走,直到剩下的和短链表的长度相同,两链表再一起走
反转链表
迭代#
自己申请三个指针:
cur:指向头结点
pre:指向空结点
tem:因为反转链表时链表会断开,所以我们需要一个指针暂存断开的位置,即cur.next
ListNode pre = null;
ListNode cur = head;
ListNode tmp = null;
while(cur!=null) {
//记录当前节点的下一个节点
tmp = cur.next;
//然后将当前节点指向pre
cur.next = pre;
//pre和cur节点都前进一位
pre = cur;
cur = tmp;
}
作者:Zhbeii
出处:https://www.cnblogs.com/zhbeii/p/15418295.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?