今天是链表的part2,也结束链表学习
24. 两两交换链表中的节点
- 不知道为什么一直显示时间超时(原因:给cur赋值时=写成了==)
19.删除链表的倒数第N个节点
- 思路很重要
- 看卡尔的思路前我只能想到先遍历统计有多少元素,然后第二遍遍历删除
- 卡尔的思路:双指针,slow和fast之间相隔n,当fast达到末尾时,slow端可以进行删除操作了
- 删除节点时,应该在被删除节点的前一个节点停下操作
面试题 02.07. 链表相交
- 差取绝对值的函数:
abs()
- 交点并不是数值相等,而是指针相等!!!指向同一个内存
- 先分别求出两个链表的长度,然后用上一题的方法
- 这题细节很多,比如如果不相交,那么直接返回
NULL
或者nodeEnd->next
,而不要返回ListNode* nullNode = new ListNode()
,在这种情况下返回的是相交于0!!!!
142.环形链表II
-
这道题很考验数学思路,虽然写过一次,但还是不记得
-
双指针法:
-
fast一次走两个,slow一次走一个,总会在环里相遇
-
相遇后,index1从head出发,index2从相遇点出发,一次走一个,最后会在环入口相遇
-
注意,fast和slow都是从head开始,而不是从head前一个虚拟节点开始(从虚拟节点开始则不行)
-
若无环,则会出现
fast and fast.next == None
-
时间复杂度为O(n),空间复杂度均O(1)
总结
- 主要是链表用得少,理论知识不牢固,要多记