你的代码存在一些逻辑错误,特别是在处理重复节点和移动指针的部分。以下是对你代码的修正:
- 在判断重复节点时,需要在内部循环中跳过所有重复的节点,并确保
fast
指向下一个非重复节点。 - 在跳过所有重复节点后,你需要将
slow.Next
直接连接到当前非重复节点,而不是简单地赋值。
这里是修正后的代码:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func deleteDuplicates(head *ListNode) *ListNode {
virtualHead := &ListNode{}
virtualHead.Next = head
result := virtualHead // 直接让 result 指向虚拟头
slow := virtualHead
fast := head // 从 head 开始遍历
for fast != nil {
// 检查是否有重复的值
if fast.Next != nil && fast.Val == fast.Next.Val {
// 找到最后一个相同值的节点
for fast.Next != nil && fast.Val == fast.Next.Val {
fast = fast.Next
}
// 将 slow 的 next 跳过所有相同值的节点
slow.Next = fast.Next
} else {
// 如果没有找到重复,则慢指针可以前进一步
slow = slow.Next
}
// 前进快指针
fast = fast.Next
}
return result.Next // 返回去掉虚拟头后的链表
}
修正要点:
- 检查并跳过所有重复项:当发现一系列相同值时,需要继续移动
fast
指针,直到遇到不同的值。 - 更新
slow
的指向:只有当没有找到相同的元素时,才可以让slow
向前移动。 - 返回正确结果:最终返回的是
result.Next
,以排除虚拟头结点。
希望这能帮助你解决问题!
内容由零声教学AI助手提供,问题来源于学员提问