(剑指Offer)面试题57:删除链表中的重复结点
题目:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路:
由于头结点有可能被删除,因此需要创建新的头结点pNew;
遍历链表,每遍历一个结点pCur,且pCur!=NULL,做以下判断:
如果它的下个结点不为空,且当前结点和下个结点的值相等,那么说明这两个是重复的结点,需要继续往下遍历,一直找到不重复的结点为止;
否则,pNew的下个结点指向当前结点pCur,即pNew->next=pCur,pNew=pNew->next;
在线测试OJ:
http://www.nowcoder.com/books/coding-interviews/fc533c45b73a41b0b44ccba763f866ef?rp=3
AC代码:
(没有delete操作,容易造成内存泄露)
/* 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* pNew= new ListNode(0); ListNode* pTmp=pNew; ListNode* pCur=pHead; while(pCur){ if(pCur->next!=NULL && pCur->val==pCur->next->val){ ListNode* pNext=pCur->next; while(pNext->next!=NULL && pNext->val==pNext->next->val) pNext=pNext->next; pCur=pNext->next; } else{ pTmp->next=pCur; pTmp=pTmp->next; pCur=pCur->next; } } pTmp->next=NULL; return pNew->next; } };
(添加delete操作,避免内存泄露)
/* 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* pNew= new ListNode(0); ListNode* pTmp=pNew; ListNode* pCur=pHead; ListNode* pDel=NULL; while(pCur){ if(pCur->next!=NULL && pCur->val==pCur->next->val){ pDel=pCur; ListNode* pNext=pCur->next; delete pDel; while(pNext->next!=NULL && pNext->val==pNext->next->val){ pDel=pNext; pNext=pNext->next; delete pDel; } pDel=pNext; pCur=pNext->next; delete pDel; } else{ pTmp->next=pCur; pTmp=pTmp->next; pCur=pCur->next; } } pTmp->next=NULL; return pNew->next; } };