zl程序教程

您现在的位置是:首页 >  后端

当前栏目

82. 删除排序链表中的重复元素 II

链表排序 删除 元素 重复 II 82
2023-09-27 14:26:29 时间

题目:

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

思路;

具体地,我们从指针 cur,cur->next 指向链表的头节点,随后开始对链表进行遍历。如果当前 cur->next 与 cur->next->next 对应的元素相同,那么我们就将 cur->next 和 cur->next 从链表中移除;否则说明链表中已经不存在其它与 cur 对应的元素相同的节点,因此可以将cur 指向 cur.next。当遍历完整个链表之后,我们返回链表的头节点即可。

代码:

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

/*
*deleteDuplicates:给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 
struct ListNode* head;已排序的链表的头 head 
返回值:已排序的链表 
*/
struct ListNode* deleteDuplicates(struct ListNode* head){
    if(head == NULL)
    {
        return head;
    }
    struct ListNode * m = malloc(sizeof(struct ListNode));//慢指针用于返回
    m->next = head;
    struct ListNode * k = m;//快指针
    int x;
    while(k->next && k->next->next)
    {
        if(k->next->val == k->next->next->val)//当前位置的下一个等于下下个节点
        {
            x=k->next->val;//临时保存下一个节点数据
            while(k->next && k->next->val == x)//把所有的相等的数都删了
            {
                k->next = k->next->next;//删除相等的节点
            }
        }
        else
        {
            k = k->next;
        }
    }
    return m->next;
}