链表
环形链表#
如果链表中有某个节点,可以通过连续跟踪 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 の 博客!
