1. 问题背景与需求分析
链表操作是算法面试中的常青树,而LeetCode 83题"删除排序链表中的重复元素"更是检验指针基本功的经典案例。这道题看似简单——给定一个已排序的链表,删除所有重复元素使每个元素只出现一次。但实际编码时会发现,指针操作稍有不慎就会导致链表断裂或内存泄漏。
我最初提交的版本虽然通过了测试用例,但在边界条件处理上存在明显缺陷。后来通过反复调试和可视化分析,才真正理解了指针移动的底层逻辑。这道题的价值在于:它完美展示了如何通过指针操作来维护链表结构,这种技能在处理更复杂的链表问题(如反转链表、环形链表检测)时同样适用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 初始解法与隐藏陷阱
2.1 直观解法的问题代码
大多数人的第一版代码可能长这样:
python复制def deleteDuplicates(head):
current = head
while current and current.next:
if current.val == current.next.val:
current.next = current.next.next
else:
current = current.next
return head
这段代码在常规情况下确实有效,但存在三个潜在风险:
- 没有处理空链表输入(head为None)
- 当链表所有元素相同时,可能遗漏尾节点处理
- 没有显式释放被删除节点的内存(在C++等需要手动管理内存的语言中会导致泄漏)
2.2 边界条件测试案例
完整的测试应该包含以下场景:
python复制测试案例1: [] → 预期输出: []
测试案例2: [1,1,1] → 预期输出: [1]
测试案例3: [1,2,3,3,4] → 预期输出: [1,2,3,4]
测试案例4: [1,1,2,3,3] → 预期输出: [1,2,3]
3. 指针操作的本质理解
3.1 链表节点的内存模型
以Python为例,每个链表节点实际上是这样的对象:
python复制class ListNode:
def __init__(self, val=0, next=None)
