劍指offer 附加1. 刪除鏈表中的重複結點

1.問題描述

在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理後爲 1->2->5.

2.解決思路

1)鏈表爲空,無重複;

2)鏈表只有一個結點,不存在重複;

3)鏈表有2個以上結點:考慮頭結點是否會被刪除的特例

  a)爲了防止頭結點重複需要刪除,在頭結點前面添加一個僞結點first;

  b)使用兩個輔助指針node1和node2,一前一後初始時分別指向first和head;

  c)向右遍歷鏈表的值,node1的下一個永遠是不重複的值,比較相鄰的node2和node2的下一個指向的值是否相等;

      11)相等:把當前值value保存下來,找到所有值等於value的,直到出現第一個不等於value的結點,讓node1指向它;

      22)不相等:node1和node2都依次向右挪動一個;

3.代碼實現

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* head)
    {
        if(head == NULL || head->next == NULL) 
            return head;
        //增加一個僞結點,以防出現頭結點被刪除的情況
        ListNode *first = new ListNode(-1);
        first->next = head;
        ListNode* node1 = first;
        ListNode* node2 = head;
        while(node2 != NULL && node2->next != NULL){
            if(node2->val != node2->next->val){
                node1 = node2;
                node2 = node2->next;                
            }
            else{
                int value = node2->val;
                while(node2 != NULL && node2->val == value){
                    node2 = node2->next;
                }
                node1->next = node2;                
            }
        }
        return first->next;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章