1. 程式人生 > >在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5

在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if (pHead == NULL || pHead->next == NULL)
            return pHead;
        /*---------先為連結串列建立一個頭結點---------*/
        ListNode* p1 = new ListNode(0);
        p1->next = NULL;//p1的軌跡記錄沒有重複的節點
        ListNode* head = p1;
        ListNode* p2 = pHead;//p2用於遍歷原連結串列,方便p1跳過重複的點
        while(p2){
            if(p2->next && p2->val == p2->next->val){
                while(p2->next && p2->val == p2->next->val){
                    p2 = p2->next;
                }
                p2 = p2->next;//p2跳過重複串中的最後一個重複節點
                //防止連結串列尾出現重複,p2==NUll,程式跳出will迴圈,而p1沒有跳過尾部重複
                p1->next = p2;
            }
            else{//如果沒有重複
                p1->next = p2;
                p1 = p2;
                p2 = p2->next;
            }
        }
        return head->next;//返回時要去除頭節點
    }
};