LeetCode算法题(Go语言实现)_31
题目
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
一、代码实现
func reverseList(head *ListNode) *ListNode {var prev *ListNode // 前驱节点初始化为nilcurrent := head // 当前节点从头节点开始for current != nil {nextTemp := current.Next // 临时保存下一个节点current.Next = prev // 反转指针方向prev = current // 前驱指针后移current = nextTemp // 当前指针后移}return prev // 返回新头节点
}
二、算法分析
1. 核心思路
- 指针逆向:通过三指针(prev/current/nextTemp)遍历链表,逐节点反转指针方向
- 原地修改:无需额外存储空间,仅通过修改指针实现反转
2. 关键步骤
- 初始化指针:
prev
初始化为nil
,current
指向头节点 - 保存后继节点:用
nextTemp
暂存current.Next
防止断链 - 指针反转:将
current.Next
指向prev
完成局部反转 - 指针后移:
prev
和current
同步后移处理下一个节点
3. 复杂度
指标 | 值 | 说明 |
---|---|---|
时间复杂度 | O(n) | 单次遍历所有节点 |
空间复杂度 | O(1) | 仅需三个指针变量 |
三、图解示例
四、边界条件与扩展
1. 特殊场景验证
- 空链表:直接返回
nil
- 单节点链表:保持原样返回
- 双节点链表:1→2 反转为 2→1
2. 多语言实现
# Python递归法实现
def reverseList(self, head: ListNode) -> ListNode:if not head or not head.next:return headp = self.reverseList(head.next)head.next.next = headhead.next = Nonereturn p
// Java双指针法
public ListNode reverseList(ListNode head) {ListNode prev = null;ListNode curr = head;while (curr != null) {ListNode nextTemp = curr.next;curr.next = prev;prev = curr;curr = nextTemp;}return prev;
}
五、总结与扩展
1. 核心创新点
- 三指针黄金法则:prev/current/nextTemp组合实现高效反转
- 数学归纳证明:局部反转的正确性保证全局正确
2. 扩展应用
- 双向链表反转:需额外处理prev指针
- K个一组反转:递归+迭代组合(LeetCode 25)
- 回文链表检测:快慢指针+局部反转(LeetCode 234)
3. 工程优化方向
- 内存预分配:Go切片预分配容量减少扩容开销
- 并发安全:添加读写锁支持多线程环境操作