LeetCode-Remove Duplicates from Sorted List II

考略最愚蠢的方式:遇到值相同的就算去一个。

于只有现出平潮的累累,采用尾插法插入新的行。

 

借设p指向当前节点,q指向p的产一个节点,(下面我们用p表示p->val,即p代表p节点存储的数值)。

(1)p==q:删除p;

  (2)p!=q:把p放入新队列;

此处我们而专注第二栽状况,如果p之前有同样的价,即使p!=q也应该删除p。为是我们设置一个flag标识,如果flag=1,表示即价出现数,flag=0,表示手上价值就出现平不行。

那具有情况如下:

  (1)p==q:删除p,同时令flag=1;

  (2)p!=q 且
flag=1(表示虽p不等于q,但眼前至少发生一个价与p相等):删除p,令flag=0;

  (3)p!=q 且 flag=0(表示p!=q,且p只现出同样软):把p插入新队列。

想开这里你见面发觉,还有一个地方需要处理,就是初队列的头结点如何规定。

有以下3种情况(原队列):

  (a)1->1->NULL:这种情形新队列为空;

  (b)1->3->7->……:新队列的头结点为1;

  (c)1->1->2->4->……:新队列的头结点为2。

变句话说,如果原先列一开始就是再的数,那么当围观的经过遭到,新队列的头结点是无力回天确定的。为夫我们装一个isHead标识,如果isHead=1,表示初队列中都来头结点,isHead=0(如果p满足(3),则把p插入新队列);表示初队列中尚没有头结点(如果p满足(3),则p就是头结点)。

循环扫描了晚(此时p不空,q=NULL),可能出如下情况:

(1)flag=1:p重复,应该去

    1.1 )isHead=1:删除p;

    1.2)isHead=0:新队列为空。

(2)flag=0:p只出现相同不良

    2.1)isHead=1:把p插入新队列;

    2.2)isHeadC语言=0:p是初队列的头结点。

下贴出C语言的实现:(但是该兑现耗时可比多,原因应该是循环中法分支过多)

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     struct ListNode *next;
 6  * };
 7  */
 8 struct ListNode* deleteDuplicates(struct ListNode* head) {
 9     if (!head) return NULL;
10     if (!head->next) return head;
11     
12     struct ListNode *p = NULL;
13     struct ListNode *q = NULL;
14     struct ListNode *r = NULL;
15     struct ListNode *newHead = NULL;//newHead denotes the new list
16     int flag = 0, isHead = 0;//isHead=0 denotes there is no head in newHead
17     p = head, q = p->next;//p denotes the current node,q denotes the next node 
18     
19     flag = 0;//there are no duplications
20     while (q)
21     {
22         if (p->val != q->val && flag == 0)//put p in new list 
23         {
24             if (!isHead)
25             {
26                 newHead = r = p;
27                 isHead = 1;//there is already head in newHead
28                 r->next = NULL;                    
29             }
30             else
31             {
32                 r->next = p;
33                 r = p;        
34                 r->next = NULL;
35             }
36         }
37         else if (p->val != q->val && flag == 1)//delete p
38             flag = 0;
39         else if (p->val == q->val)//delete p
40             flag = 1;
41             
42         p = q;
43         q = q->next;
44     }
45     
46     if (flag == 1)
47     {
48         if (!isHead)
49             newHead == NULL;
50         else
51             r->next = NULL;
52     }
53     else
54     {
55         if (!isHead)
56         {
57             newHead = p;
58             newHead->next = NULL;
59         }
60         else
61         {
62             r->next = p;
63             r = p;
64             r->next = NULL;
65         }
66     }
67     
68     return newHead;
69 }