本篇博客会讲解力扣“83. 删除排序链表中的重复元素”的解题思路,这是题目链接。
由于链表是排好序的,我们可以通过遍历一次链表的方式,删除所有重复的结点。具体来说,
- 如果链表为空,则不需要删除,直接返回空链表。
- 如果链表非空,则使用指针变量cur,从链表的头结点head开始,向后遍历。每次遍历时,检查cur->next的值和cur的值是否相同,若相同,则需要删除cur->next;若不相同,则说明链表中不存在值和cur相同的结点了,让cur指向cur->next即可。重复以上步骤,直到cur->next为空,即cur指向了链表的尾结点,此时不存在值和cur相同的结点,因为cur后面已经没有结点了,结束遍历。
struct ListNode* deleteDuplicates(struct ListNode* head) {
if (head == NULL)
{
return head;
}
struct ListNode* cur = head;
while (cur->next)
{
if (cur->next->val == cur->val)
{
// 删除cur->next
struct ListNode* del = cur->next;
cur->next = del->next;
free(del);
}
else
{
// 此时不存在和cur的值相同的结点
cur = cur->next;
}
}
return head;
}
总结
本题的关键在于想清楚删除的过程。若cur->next的值和cur相同,说明cur->next是要删除的,否则说明链表中不存在值和cur相同的结点了。
感谢大家的阅读!