目录
前言
记录一下自己刷代码随想录的过程,希望能坚持下去,思路、代码均来自于代码随想录。
链表均为单链表。
1.移除链表元素
设置一个虚拟头节点,这样就不用单独分析头节点删除的情况
2.设计链表
设置虚拟头节点,注意删除/添加时,当前指针应该指向哪(指向要删的前一个元素),由此判断循环次数
3.反转链表
- 双指针:定义一前(cur)一后(pre)两个指针,将下一节点用tmp指针保存一下,改变cur.next=pre,即实现了这两节点的转向,移动两指针,循环。Cur指针指向null时,循环结束。
- 递归:思路与双指针一样,同样是当cur为空的时候循环结束,不断将cur指向pre的过程。传参的变化实现了双指针向前移动。
4.两两交换链表中的节点
画图,注意操作的先后顺序
5.删除链表的倒数第n个节点
删除指针时当前指针应指向要删除的前一个指针
双指针:fast先移动n步,然后fast和slow同时移动,直到fast指向链表末尾,此时slow指向要删除的前一个指针。
6.链表相交
遍历求两链表的长度,差为n,长的链表就多走n步,然后同时移动两指针,判断是否相等。
7.环形链表
- 判断是否有环:快慢指针判断,快指针一次移动两个节点,慢指针一次移动一个节点,如果两指针相等,则有环。
- 如果有环,如何找到环的入口:
(x + y) * 2 = x + y + n (y + z)
可推导出x = (n - 1) (y + z) + z,,这就意味着,从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。
总结
虚拟头节点——当前指针应指向哪里——注意空指针——循环判断中是cur.next!=null还是cur!=null——修改指针方向时注意顺序——双指针——有环的判断
链表变化较复杂时可画图辅助理解。