
1. 链表数据结构基础认知链表作为线性表的链式存储结构在算法面试中出现的频率仅次于数组。与数组的连续内存空间不同链表通过指针将零散的内存块串联起来每个节点Node包含数据域和指针域。这种差异直接导致了两者在CRUD操作上的时间复杂度差异插入/删除链表O(1) vs 数组O(n)随机访问链表O(n) vs 数组O(1)实际面试中最常遇到的是单链表结构其典型定义为class ListNode: def __init__(self, val0, nextNone): self.val val self.next next关键理解链表问题的核心在于指针操作所有进阶问题都是基础指针操作的组合与变形。建议在纸上画出节点和指针的变化过程比单纯在脑中想象更可靠。2. 高频题型分类解析2.1 基础指针操作类反转链表LeetCode 206是必须肌肉记忆的入门题。迭代解法需要维护prev、curr、next三个指针def reverseList(head): prev None curr head while curr: next_node curr.next # 临时保存 curr.next prev # 反转指针 prev curr # 前移prev curr next_node # 前移curr return prev环形链表检测LeetCode 141采用快慢指针法快指针每次两步慢指针每次一步。如果存在环两者必定相遇def hasCycle(head): slow fast head while fast and fast.next: slow slow.next fast fast.next.next if slow fast: return True return False2.2 双指针技巧类相交链表LeetCode 160的优雅解法是让两个指针分别遍历AB和BA这样必然在交点处相遇def getIntersectionNode(headA, headB): p1, p2 headA, headB while p1 ! p2: p1 p1.next if p1 else headB p2 p2.next if p2 else headA return p1删除倒数第N个节点LeetCode 19使用快慢指针快指针先走n步def removeNthFromEnd(head, n): dummy ListNode(0, head) fast slow dummy for _ in range(n): fast fast.next while fast.next: fast fast.next slow slow.next slow.next slow.next.next return dummy.next2.3 复杂结构处理类LRU缓存LeetCode 146需要哈希表双向链表的组合结构。双向链表维护访问顺序哈希表实现O(1)访问class DLinkedNode: def __init__(self, key0, value0): self.key key self.value value self.prev None self.next None class LRUCache: def __init__(self, capacity: int): self.cache {} self.capacity capacity self.head DLinkedNode() self.tail DLinkedNode() self.head.next self.tail self.tail.prev self.head3. 核心解题方法论3.1 指针操作四要素边界处理头节点、尾节点、空链表等特殊情况指针移动顺序先保存再断链避免指针丢失循环终止条件while curr 还是 while curr.next虚拟头节点dummy节点能统一处理逻辑3.2 调试技巧打印链表定义print_list函数辅助调试画图分析在纸上画出每步操作后的指针变化断点调试在关键步骤后检查指针指向4. 典型错误与纠正4.1 指针丢失问题错误示例# 错误直接修改curr.next导致后续节点丢失 curr.next prev curr curr.next # 此时curr.next已经是prev了正确做法next_node curr.next # 先保存 curr.next prev # 再修改 curr next_node # 最后移动4.2 循环终止条件错误反转链表时的常见错误while head: # 会导致最后prev指向None while head.next: # 会漏掉最后一个节点5. 进阶挑战题目K个一组翻转链表LeetCode 25需要递归迭代结合复制带随机指针的链表LeetCode 138哈希表或节点复制技巧排序链表LeetCode 148归并排序的链表实现回文链表LeetCode 234快慢指针找中点反转后半部分6. 实战经验分享代码模板化将反转、找中点等操作封装成函数测试用例设计空链表单节点链表头/尾节点操作偶数/奇数长度链表时间复杂度优化多数链表问题都可以用O(n)时间O(1)空间解决链表问题的突破关键在于将视觉化的指针操作转化为代码逻辑。建议每天保持3道链表的刻意练习持续两周后会有显著提升。对于复杂问题先分解为多个基础操作组合再逐步实现。