1. 程式人生 > >刪除鏈表中重復的結點

刪除鏈表中重復的結點

describe image urn ati lis while null number nod

題目描述

在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理後為 1->2->5 1 遞歸
/*
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;
        
        while(pHead!=NULL && pHead->next!=NULL && pHead->val==pHead->next->val)
        {
            while(pHead!=NULL &&pHead->next!=NULL && pHead->val==pHead->next->val) {
                pHead=pHead->next;
            }
            pHead=pHead->next;
        }
        
        if(pHead!=NULL) {
            pHead->next=deleteDuplication(pHead->next);
        }
        return pHead;
        
    }
};

  

2.

/*
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 *HeadNode = new ListNode(-1);
        HeadNode ->next = pHead;
        ListNode *pveNode = HeadNode;
        ListNode *p = HeadNode->next;
        ListNode *nextNode = p->next;
        while(p!=NULL && p->next!=NULL){
            if(p->val == nextNode->val){
                while(nextNode->next != NULL && nextNode->val == nextNode->next->val){
                    nextNode = nextNode->next;
                }
                p=nextNode->next;
                nextNode = p->next;
                pveNode->next = p;
            }else{
                pveNode = p;
                p=nextNode;
                nextNode = nextNode->next;
            }
        }
        return HeadNode->next;
        
    }
};

  

思路3: 技術分享 1.加一個頭結點 2.兩個臨時指針p,q 3.找前後不相等的節點
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if (pHead == NULL || pHead->next == NULL)
            return pHead;
 
        /*---------先為鏈表創建一個頭結點---------*/
 
        int firstNumber = pHead->val;
 
        //假設我的頭結點數值為-1
        int myFirst = -1;
 
        //萬一鏈表的頭結點也為-1,那麽我就改成-2
        if (myFirst == firstNumber)
        {
             
            myFirst = -2;
        }
        ListNode *head = new ListNode(myFirst);
        head->next = NULL;
        head->next = pHead;
 
        ListNode *p = head;
        ListNode *q = head->next;
 
        while (q)
        {
            while (q->next && (q->next->val == q->val))
            {
                q = q->next;
            }
            if (p->next != q)
            {
                 
                q = q->next;
                p->next = q;
            }
            else
            {
                p = q;
                q = q->next;
            }
        }
 
        //返回的時候,註意去掉頭結點(自己創建的輔助節點)
        return head->next;
 
    }
};

  

http://blog.csdn.net/eversliver/article/details/52234333

刪除鏈表中重復的結點