【剑指offer】删除链表中重复的结点

题目链接:删除链表中重复的结点

 

题意:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

 

题解:感觉也是数据结构里的常见题。如果找到当前节点的重复节点,就找到它最后一个重复节点。然后用它前一个节点指向它最后一个重复节点的下一个节点即可。考虑一下首元素为重复节点的特殊情况就行了,只需要把头指针更新。

 

代码:

 1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6         val(x), next(NULL) {
 7     }
 8 };
 9 */
10 class Solution {
11 public:
12     ListNode* deleteDuplication(ListNode* pHead){
13         if(pHead == NULL)    return NULL;
14         ListNode* pre = NULL;
15         ListNode* cur = pHead;
16         ListNode* pnext = NULL;
17         
18         while(cur != NULL){
19             //当前节点和下一个节点相同
20             if(cur->next != NULL && cur->val == cur->next->val){
21                 pnext = cur->next;
22                 while(pnext->next != NULL && pnext->next->val == cur->val){
23                     pnext =pnext->next;     //一直找到不相同。
24                 }
25                 //如果指向第一个节点,就删除
26                 if(cur == pHead)    pHead = pnext->next;
27                 else    pre->next = pnext->next;    //否则就指向下一个
28                 cur = pnext->next;    //向前走
29             }
30             else{    //不相同就向前走
31                 pre = cur;
32                 cur = cur->next;
33             }
34         }
35         
36         return pHead;
37     }
38 };

 

posted @ 2020-03-05 22:50  甜酒果。  阅读(176)  评论(0编辑  收藏  举报