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

时间:2019-09-15
本文章向大家介绍82. 删除排序链表中的重复元素 II,主要包括82. 删除排序链表中的重复元素 II使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、自己写出来的惨不忍睹,没有可读性,面向错误样例编程的代码。思路其实是差不多的,但是一点没有优化,十分恶心。

 1 ListNode* deleteDuplicates(ListNode* head) {
 2     if (head == nullptr)
 3         return nullptr;
 4     ListNode* dummy = new ListNode(0);
 5     dummy->next = head;
 6     ListNode* pre = dummy;
 7     ListNode* temp = head;
 8     bool same = false;
 9     while (temp != nullptr &&temp->next!=nullptr)
10     {
11         if (temp->val == temp->next->val)
12         {
13             pre->next = temp->next;
14             temp = temp->next;
15             same = true;
16         }
17         else if (same == true)
18         {
19             same = false;
20             pre->next = temp->next;
21             temp = temp->next;
22         }
23         else
24         {
25             pre = temp;
26             temp = temp->next;
27         }
28     }
29     if (same == true)
30         pre->next = temp->next;
31     return dummy->next;
32 }

二、题解中的非递归代码。思路和我的差不多,把重复的都走一遍,走到不重复的连起来。<真·精简><真·易懂>

 1 ListNode* deleteDuplicates(ListNode* head) {
 2     if (head == nullptr)
 3         return nullptr;
 4     ListNode* dummy = new ListNode(0);
 5     dummy->next = head;
 6     ListNode* temp = head;
 7     ListNode* res = dummy;
 8     while (temp != nullptr)
 9     {
10         bool same = false;
11         while (temp != nullptr&&temp->next != nullptr&&temp->val == temp->next->val)
12         {
13             same = true;
14             temp = temp->next;
15         }
16         if (same == false)
17         {
18             res->next = temp;
19             res = res->next;
20         }
21         temp = temp->next;
22     }
23     res->next = nullptr;
24     return dummy->next;
25 }

三、递归代码:

 1 ListNode* deleteDuplicates(ListNode* head) {
 2     if (head == nullptr)
 3         return nullptr;
 4     if (head->next != nullptr&&head->val == head->next->val)
 5     {    
 6         while(head->next!=nullptr&&head->val==head->next->val)
 7             head = head->next;
 8         return deleteDuplicates(head->next);
 9     }
10     else
11     {
12         head->next = deleteDuplicates(head->next);
13     }
14     return head;
15 }

四、快慢指针:差东西,可读性差

ListNode* deleteDuplicates(ListNode* head) {
    if (head == nullptr)
        return nullptr;
    ListNode* dummy = new ListNode(0);
    dummy->next = head;
    ListNode* fast = head;
    ListNode* slow = dummy;
    while (fast)
    {
        if (fast->next&&fast->val != fast->next->val)
        {
            if (slow->next == fast)
                slow = fast;
            else
                slow->next = fast->next;
        }
        else if (!fast->next)
        {
            if (slow->next != fast)
            {
                slow->next = nullptr;
            }
        }
        fast = fast->next;
    }
    return dummy->next;
}

原文地址:https://www.cnblogs.com/zouma/p/11522567.html