题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路一(非递归):
先设置一个虚拟结点dummy,使dummy->next = pHead,设置last指针指向dummy,令指针p从链表头开始遍历,当p和p->next的值相等时,用while循环让p指向连续相等的数的末尾的后一位,此时让last指向p,并继续外层循环,当p和p->next不相等时,此时可以确定p所指结点可以保留,则让last指向p,p指向p->next。
代码一:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead) {
ListNode* dummy = new ListNode(-1);
dummy->next = pHead;
ListNode *last, *p;
p = pHead;
last = dummy;
while(p != NULL && p->next != NULL) {
if(p->val == p->next->val) {
int val = p->val;
while(p != NULL && p->val == val) {
p = p->next;
}
last->next = p; //此时还不能令last=p,因为任然不清楚p和p->next是否相同
} else {
last = p;
p = p->next;
}
}
return dummy->next;
}
};
思路二(递归版):
对pHead和pHead->next进行判断,若取值相等,则用while循环找到第一个不等的结点cur,则返回deleteDuplication(cur);若取值不等,则令pHead->next = deleteDuplication(pHead->next),继续递归求解;在递归时需要在初始位置判断递归结束的条件,pHead == NULL返回NULL,pHead != NULL && pHead->next == NULL 返回pHead。
代码二:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead) {
if(pHead == NULL) return NULL;
if(pHead != NULL && pHead->next == NULL) return pHead;
ListNode *cur;
if(pHead->val == pHead->next->val) {
cur = pHead->next->next;
while(cur != NULL && cur->val == pHead->val) {
cur = cur->next;
}
return deleteDuplication(cur);
} else {
pHead->next = deleteDuplication(pHead->next);
return pHead;
}
}
};