删除排序链表中的重复元素
题目:
给定一个已排序的链表的头
head
, 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。示例 1:
输入:head = [1,1,2] 输出:[1,2]示例 2:
输入:head = [1,1,2,3,3] 输出:[1,2,3]
思路:
初始化两个指针:
slow
指向当前不重复链表的末尾(初始为head
)。
fast
用于遍历链表(初始为head->next
)。遍历链表:
如果
fast->val != slow->val
,说明fast
是一个新值,应该保留:
更新
slow->next = fast
(连接不重复的节点)。移动
slow = slow->next
(更新不重复链表的末尾)。不管是否相等,
fast
都继续向后移动。
代码:
struct ListNode* deleteDuplicates(struct ListNode* head)
{
if (head == NULL)
{
return NULL;
}
struct ListNode* slow = head;
struct ListNode* fast = head->next;
while (fast != NULL)
{
if (fast->val != slow->val)
{
slow->next = fast; // 连接不重复的节点
slow = slow->next; // 移动 slow
}
fast = fast->next; // 继续遍历
}
slow->next = NULL; // 截断尾部存在的重复节点
return head;
}