题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
分析:
因为已经排好序了,所以如果相邻的数值一样的话,那么就跳过该数值,不过要记录前一结点的指针,将其next指向后一个没有重复的结点。
代码:
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* phead = NULL; 15 ListNode* p1 = pHead; 16 ListNode* p2 = NULL; 17 while(p1) { 18 if(p1->next) { 19 int val = p1->val; 20 if(val == p1->next->val) { 21 while(p1->next && p1->next->val == val) p1 = p1->next; 22 } else { 23 if(phead == NULL) phead = p2 = p1; 24 else { 25 p2->next = p1; 26 p2 = p1; 27 } 28 } 29 } else { 30 if(phead == NULL) phead = p2 = p1; 31 else { 32 p2->next = p1; 33 p2 = p1; 34 } 35 } 36 if(p1 == NULL) break; 37 p1 = p1->next; 38 } 39 if(p2) p2->next = NULL; 40 return phead; 41 } 42 };