Linked List
反转链表
|
|
反转链表关注 pre和cur在开始前和结束后的位置,在这一题中,旧pre的next为新的pre,旧cur的 next为新的cur.
如果是反转一整条链表,那么最后返回pre就好了。
- K 个一组翻转链表
快慢指针
可以用来找中间节点、判断链表是否有环
这种写法,比如有4个节点,slow最后停在第三个节点。
如果把fast初始化为 head.next,slow 最后停在第二个节点。
|
|
若初始化fast=head.next,则最后可以得到 slow为正中间的节点。比如节点总数为8,slow停留在第四个节点。
LC 143(快慢指针+反转链表)
首先找到中间节点mid,给mid后面都反转。因为从结果来看,这些指针都是需要被反转的。
图上表示反转后的结果,之后只需要不断地让head1.next=head2, head2.next=head1 即可。
经过观察发现,不过是奇数还是偶数链表,当head2.next为 None 时可以结束循环。
复制随机链表
TODO
LC 146. LRU Cache
双向链表->实现插入和删除节点都为 O(1)
dict->key 为 key,value 为 Node
辅助函数: remove(node), get_node(key)->node(返回节点并且把该节点放到链表最前端), push_front(node)
可以一直保持 dummy.pre为最后一个节点,因为在 push_front的时候就修改了 dummy.pre
LC 106. 相交链表
设 A 链表自己的部分长为 x, B 链表自己的部分长为 y, 两个链表共同部分长为 z。
思路:让从 AB 链表出发的两个指针都走上距离x+y+z,它们会在c1节点相遇。