通用操作
链表类
1 | # Definition for singly-linked list. |
创建头指针
1 | dummy=ListNode(0) |
向前移动指针
1 | head=head.next #移动到下一个指针 |
删除next节点
1 | head.next=head.next.next #删除next节点 |
反转链表,也可以是双指针操作的模板:备改二移
pre是一个始终在head前的节点
1 | pre=None |
用快慢指针找中点<—重要
fast 如果初始化为 head.Next 则中点在 slow.Next
fast 初始化为 head,则中点在 slow
1 | def findMiddle(self,head): |
链表去重-i
思路:遍历链表,使相同元素缩减为1
主要的困难在于dummy头节点的保持,以及head的next判断
1 | # Definition for singly-linked list. |
链表去重-ii
思路:遍历链表,使相同元素缩减为1
主要的困难在于dummy头节点的保持,以及head的next判断
重点
1 | #head=head.next #删除的错误操作,这只是移动到下一个指针 |
代码
1 | # Definition for singly-linked list. |
反转单链表——经典
1 | # Definition for singly-linked list. |
反转链表(m,n)
与反转链表差不多
重点是将 关键的四个节点:反转的关节点、以及链表的头指针Dummy记录好
1 | # Definition for singly-linked list. |
有序链表合并
思路:创建新链表,遍历两个旧链表,一个一个连上,与归并排序的合并差不多
1 | # Definition for singly-linked list. |
排序链表
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
根据题目要求,我们需要使用快排,或者归并排序
思路就不赘述了
快排:本意是想用分隔链表的操作来做的,但是没做成功。超时了,需要再测试测试,应该是陷入了死循环或者死递归
1 | # Definition for singly-linked list. |
归并:
- 用快慢指针找中点<—重要
- 用有序链表合并算法合并左右两个链表
1 | # Definition for singly-linked list. |
分隔链表
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
1 | 输入: head = 1->4->3->2->5->2, x = 3 |
其实这道题思路蛮简单的,就是代码写起来容易混乱。
要对链表的增删查改足够清晰
对于这道题,主要是是删除\跳过的操作一点不清晰,就会写不出来
首先需要一个Dummy节点,这个节点是我们新的头节点,这是创建之后就不能动的
然后使
Dummy.next=head
,这一步使得Dummy正式成为头节点然后使
head=Dummy
,这一步使得head从Dummy开始遍历(然后while循环就可以从head.next开始了)然后我们先取出要删除的节点,然后再
head.next=head.next.next
1
2tmp=head.next #先备份该节点
head.next=head.next.next #删除一个节点的操作然后就删除成功了
1 | # Definition for singly-linked list. |
重排链表
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
1 | 给定链表 1->2->3->4, 重新排列为 1->4->2->3. |
示例 2:
1 | 给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3. |
思路
- 快慢指针找中点,根据中点拆分链表
- 使右链表逆转
- 合并两链表,一左一右地合并,最后再合并最后一个不为空的
1 | # Definition for singly-linked list. |
环形链表-i
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
思路
主要思路还是快慢指针,如果由
1 | # Definition for singly-linked list. |
❓ 环形链表-ii
找环的入口点:
- 首先快慢指针找到中点
- 然后fast会到head节点,slow移动到中点,二者同步向前移动,最终相遇时即是环的入口点?
1 | # Definition for singly-linked list. |
深拷贝链表
- 哈希表深拷贝
- 有丝分裂法
1 | """ |
两链表的公共节点
主要是参透了
a+c+b=b+c+a
即三者相加距离相同,就可以找到答案
设交集链表长c,链表1除交集的长度为a,链表2除交集的长度为b,有
- a + c + b = b + c + a
- 若无交集,则a + b = b + a
1 | # Definition for singly-linked list. |
两两交换链表中的节点
主要要用tmp把暂时无关的节点存好
1 | # Definition for singly-linked list. |