链表
环形链表#
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos
是 -1
,则在该链表中没有环。注意:pos
不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
1 | func detectCycle(head *ListNode) *ListNode { |
当 快慢指针相遇时是相遇点,如果想要找到初始环形点
就 重新定义一个指针 开始跑
两者相遇就是起始点
不要问为什么: 这个数学归纳法可以做,当作结论记一下所以我才写一篇博客记录
Gpt:
- 快慢指针相遇:首先使用快慢指针(
fast
和slow
)来检测链表中是否存在环。快指针fast
每次移动两步,慢指针slow
每次移动一步。如果链表中有环,那么快指针最终会追上慢指针,即fast
和slow
会在环内的某个节点相遇。 - 寻找环的起始节点:一旦快慢指针相遇,我们需要找到环的起始节点。此时,代码中创建了一个新的指针
p
,它被初始化为链表的头节点head
。 - 指针同步移动:然后,代码进入一个循环,在这个循环中,
p
和slow
指针同步移动,每次移动一步,直到p
和slow
相遇。由于slow
指针已经位于环内,所以当p
和slow
相遇时,p
指针将指向环的起始节点。 - 返回结果:循环结束后,
p
指针指向的就是环的起始节点,然后返回这个节点。
删除链表的倒数第N个结点#
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点
1 | func removeNthFromEnd(head *ListNode, n int) *ListNode { |
好好领悟一下这个快慢指针的意义
LRU缓存#
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache
类:
LRUCache(int capacity)
以 正整数 作为容量capacity
初始化 LRU 缓存int get(int key)
如果关键字key
存在于缓存中,则返回关键字的值,否则返回-1
。void put(int key, int value)
如果关键字key
已经存在,则变更其数据值value
;如果不存在,则向缓存中插入该组key-value
。如果插入操作导致关键字数量超过capacity
,则应该 逐出 最久未使用的关键字。
函数 get
和 put
必须以 O(1)
的平均时间复杂度运行。
1 | type entry struct { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Echin の 博客!