1、题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
2、解题思路
因为头结点可能会被删除,所以需要设置一个新的头结点;
遍历链表,设置两个指针,当前后两个指针所指向的值域不同时,就可以将新链表的next指针指向前一指针指向的节点;
当前后两个指针所指向的值域相同时,就继续向下遍历,直到遇见值不同的节点;
3、源码
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if(NULL == pHead)
return NULL;
if(NULL == pHead->next)
return pHead;
ListNode* pNewHead=new ListNode(0);
ListNode* pNewCur=pNewHead;
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{
pNewCur->next=pCur;
pNewCur=pNewCur->next;
pCur=pCur->next;
}
}
pNewCur->next=NULL;
return pNewHead;
}
};