【剑指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 };