4/21 力扣 82. 删除排序链表中的重复元素 II

发布时间 2023-04-21 12:57:09作者: aallofitisst

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

 

示例 1:


输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2:


输入:head = [1,1,1,2,3]
输出:[2,3]
 

提示:

链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序 排列

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* deleteDuplicates(struct ListNode* head){}
struct ListNode* deleteDuplicates(struct ListNode* head) {
    // 创建一个虚拟头节点
    struct ListNode *dummy = malloc(sizeof(struct ListNode));
    dummy->next = head;
    // prev 指向当前不重复节点的前驱节点
    struct ListNode *prev = dummy;
    // 遍历链表
    while (head && head->next) {
        // 如果当前节点和下一个节点的值相同
        if (head->val == head->next->val) {
            // 继续向后遍历,直到找到第一个不同的节点
            while (head->next && head->val == head->next->val) {
                head = head->next;
            }
            // 将前驱节点的 next 指针指向这个不同的节点,从而删除所有重复的节点
            prev->next = head->next;
        } else {
            // 如果当前节点和下一个节点的值不同,更新 prev 指针
            prev = prev->next;
        }
        // 继续遍历下一个节点
        head = head->next;
    }
    // 返回虚拟头节点的 next 指针
    return dummy->next;
}