24 两两交换链表中的节点
关键点1:创建虚拟头节点,这里cur指向虚拟头节点,每次两两交换不会影响到头节点,受影响的是头节点后的两个节点A和B,需要安排好A的前指针和B的后指针(姑且这么叫,比较方便理解)
关键点2:A的前指针和B的后指针需要提前保存以免更改next指针时找不到,cur代表一个节点的地址,cur->next改变就是节点指向的下一个节点的改变。
关键点3:每次创建的虚拟头节点,最后都需要销毁。
19 删除链表的倒数第N个节点
关键点1:思想很巧妙,灵活运用快慢指针,因为不能遍历完一遍链表再回头找倒数第n个节点,因为这是单链表,亦可以理解为单向链表。所以定义快慢指针,让快指针先走n步,那么当快指针走到null,慢指针刚好走到倒数第n个节点。
关键点2:while(fast != null)这里fast在最后一个节点也算数。
关键点3:由于这样走slow指针走到倒数第n个节点,实际上我们删除节点是利用上一个节点,所以fast走完n步应该多走一步,slow就停在倒数n+1节点上。
面试题2.7 链表相交
关键点1:相交指的是节点的地址相同,而不是节点的数值val相同。
关键点2:相交节点的毛毛虫”尾巴“长度是一样的,所以让长的毛毛虫走到与短的毛毛虫相同的位置再去遍历找交点。
142 环形链表2
这个题目感觉不但考察代码能力,更考验逻辑能力。
关键点1:快指针一次走两步,慢指针一次走一步,这样就不会错过慢指针。
关键点2:这时候,快指针和慢指针相交点就是环形链表的相遇点。将进入环形链表前的一段设为x,环形链表分为y和z,那么有公式2(x+y) = x+y+n(z+y),当n=1,由x=z。n一定为1,不多解释,与快慢指针速度有关。所有,从头节点以及相遇点同时出发,相遇点就是环形链表的入口。