c_cpp 给定已排序的链接列表,删除所有具有重复数字的节点,只留下原始列表中的不同数字。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 给定已排序的链接列表,删除所有具有重复数字的节点,只留下原始列表中的不同数字。相关的知识,希望对你有一定的参考价值。

// verion 1, untested
ListNode* remove_duplicates(ListNode *head) {
    if(!head || !head->next) return head;
    ListNode dummy(0);
    dummy.next = head;
    ListNode *pre = &dummy, *cur = head;
    bool delete_self = false;
    while(cur) {
        if(delete_self == true) {
            ListNode *nxt = cur->next;
            delete cur;
            pre->next = nxt;
            cur = nxt;
            delete_self = false;
            continue;
        }
        ListNode *nxt = cur->next;
        if(nxt == NULL) return dummy.next;
        if(cur->val == next->val) {
            ListNode *nnxt = nxt->next;
            delete nxt;
            delete_self = true;
            cur->next = nnxt;
        } else {
            pre = cur;
            cur = cur->next;
        }
    } 
    return dummy.next;
}

// version2, better and tested
ListNode* remove_duplicates(ListNode *head) {
    if(!head || !head->next) return head;
    ListNode dummy(-1);
    dummy.next = head;
    ListNode *pre = &dummy, *cur = head;
    while(cur) {
        ListNode *nxt = cur->next;
        bool can_delete = false;
        while(nxt && cur->val == nxt->val) {
            can_delete = true;
            cur->next = nxt->next;
            delete nxt;
            nxt = cur->next;
        }
        if(can_delete == true) {
            pre->next = cur->next;
            delete cur;
            cur = pre->next;
            can_delete = false;
        }
        else {
            pre = cur;
            cur = cur->next;
        }
    }
    return dummt.next;
}


以上是关于c_cpp 给定已排序的链接列表,删除所有具有重复数字的节点,只留下原始列表中的不同数字。的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 给定一个已排序的链表,删除所有重复项,使每个元素只出现一次。

c_cpp 从未排序的链接列表中删除重复项

c_cpp 合并两个已排序的链接列表

c_cpp 删除给定位置的链接列表节点

c_cpp 83.从排序列表中删除重复项

c_cpp 合并两个已排序的链接列表,使合并列表的顺序相反