思路:
1.用两个指针,第一个存之前的结点,第二种存当前结点。
2.每次判断当前结点与当前结点的下一个结点的值是否相同,如果相同就去调用函数寻找下一个与当前结点的值不同的几点,然后将前一个结点与找到的下一个结点连接起来。
如果不同则寻找一个:将当前结点的值付给前结点,当前结点移动到下一个结点。
注意一下几点:
1.对于刚开始的结点有重复值的情况,最开始的前指针pre是空的,无法连到下一个找到的不同的结点。因此这种情况直接将头结点更新即可。
2.链表内的结点全部重复的情况,不必将空指针连接,直接返回空指针。
3.对于两个结点判断是否相等,一定要两个结点都判断是否为空。
1 class Solution { 2 public: 3 ListNode* deleteDuplication(ListNode* pHead) 4 { 5 if (pHead == NULL) 6 return NULL; 7 //第一个结点是否为相同结点 8 ListNode* pre = NULL; 9 ListNode* cur = pHead;//至少有一个结点 10 while (cur!=NULL&&cur->next!= NULL)//至少有两个结点,一定要两个结点都判断 11 //我开始写的是while (cur->next!= NULL)牛客超时我还想了很久 12 //原因是开始虽然判断了当前结点不为空,可是后面再while里循环的时候当前结点仍然有可能为空 13 { 14 if (cur->val == cur->next->val) 15 { 16 //寻找下一个不同值的结点 17 cur = howmanynodes(cur); 18 19 if (pre == NULL) 20 { 21 pHead = cur;//头结点重复,更新头结点 22 if (pHead == NULL)//前后都为空,所有结点都重复,返回空 23 return NULL; 24 } 25 else 26 { 27 pre->next = cur;//将pre和找到的下一个结点连接起来 28 } 29 } 30 else//该节点与下个结点的值不同 31 { 32 pre = cur; 33 cur = cur->next; 34 } 35 36 } 37 return pHead; 38 } 39 ListNode* howmanynodes(ListNode* pHead)//参数是一个已知至少有一个相同项的结点,返回下一个不同的结点 40 { 41 int eq = pHead->val; 42 while (pHead != NULL) 43 { 44 if (pHead->val == eq) 45 { 46 pHead = pHead->next; 47 } 48 else 49 return pHead; 50 } 51 return NULL; 52 53 } 54 };