剑指Offer——删除链表中重复的结点

题目描述:

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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 };
原文地址:https://www.cnblogs.com/jacen789/p/7747789.html