24.两两交换链表中的节点
题目描述:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)
物理节点交换而不是节点的内部数值交换
虚拟头节点
修改当前节点的指向一定要知道它的前一个节点
容易出现空指针异常或者无限死循环问题
链表节点数:(遍历结束的条件)(注意先后判断顺序有可能引发空指针异常)
(1)偶数:current—>next=Null
(2)奇数:current—>next—>next=Null
设置临时节点储存中间节点值和返回真正的头节点
分割线————————————————————————————————————————
19.删除链表的倒数第N个节点
题目描述:给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点
双指针法(快慢指针):找到倒数第n个节点
快指针走n+1步才可以让慢指针正好走到要操作的位置
虚拟头节点:返回真正的头节点
分割线————————————————————————————————————————
142.环形链表||
题目描述:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
(1)判断链表是否有环
快慢指针相遇说明有环
思考:快指针相对于慢指针是每次以一个节点的速度在移动,所以快慢指针一定会在环里相遇
(2)找到环的入口
快指针至少已经转了一圈了
难点如下:
X=(n-1)(y+z)+z
(1)当n=1时,快指针转了一圈以后和慢指针相遇了,x=z时会在环的入口初相遇
(2)n=2/3/4.......100.....
自行思考or看视频讲解数学证明
慢指针在重合区间里一定被快指针超过了
分割线————————————————————————————————————————