反转链表代码出现nil指针解引用运行时错误原因咨询
问题分析与解决
1. nil指针解引用panic的原因
当输入链表为空(head == nil)时,代码会直接执行for head.Next != nil的条件判断——对nil指针访问Next字段,直接触发invalid memory address or nil pointer dereference的panic。就算输入是[1,2,3,4,5],你的循环逻辑也会导致后续出现指针访问异常。
2. 循环逻辑错误,无法完成链表反转
Go的并行赋值是先计算所有右值,再统一赋值给左值,这会让你的循环提前断开链表,无法按预期执行4次:
比如第一次循环时:
- 初始状态:
head指向节点1,prev为nil - 计算右值:
head.Next是节点2,prev是nil,head是节点1 - 赋值后:
head变成节点2,head.Next被设为nil(原prev的值),prev变成节点1
此时节点2的Next已经是nil,下一次循环条件head.Next != nil不成立,循环直接终止,根本处理不到节点3、4、5。
修正后的代码
func reverseList(head *ListNode) *ListNode { var prev *ListNode current := head for current != nil { nextTemp := current.Next // 先保存下一个节点,避免链表断开 current.Next = prev // 反转当前节点的指针 prev = current // prev 移动到当前节点 current = nextTemp // current 移动到下一个节点 } return prev }
修正逻辑说明
- 用
current变量遍历链表,避免直接修改原head导致指针混乱 - 循环条件改为
current != nil,既兼容空链表的情况,也能遍历到最后一个节点 - 先保存下一个节点,再依次反转指针、移动指针,确保链表不会提前断开
内容的提问来源于stack exchange,提问作者Tho Do
相关产品推荐
相关产品推荐

