题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路:
1、非递归方法,使用两个指针p、q分别指向前后两个值不相等的节点,q指向拥有重复节点的最后一个节点,然后判断p、q是否相邻,p、q不相邻说明q指向的节点是重复节点,需要删除q指向的节点:q = q->next; p->next = q; p、q相邻说明q指向的不是重复节点,需要保留:p = q; q = q->next;
2、递归方法:
三要素:
1、函数返回一个删除重复节点的链表
2、递进关系:如果第一个节点不是重复节点,则返回的链表包含第一个节点,继续删除链表后续节点中的重复节点;如果第一个节点是重复节点,则删除这几个重复节点,返回链表不包含这个节点,继续删除链表后续节点中的重复节点。
3回归关系:当链表为空或者链表只有一个节点时,这个链表不包含重复节点,直接返回
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
//非递归方法
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead == nullptr || pHead->next == nullptr)
return pHead;
//创建一个头节点
int myHeadVal = -1;
if(myHeadVal == pHead->val)
myHeadVal = -2;
ListNode* myHead = new ListNode(myHeadVal);
myHead->next = pHead;
ListNode* p = myHead;
ListNode* q = pHead;
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 myHead->next;
}
};
class Solution {
public:
//递归方法
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead == nullptr || pHead->next == nullptr)
return pHead;
if(pHead->val == pHead->next->val){
while(pHead->next != nullptr && pHead->val == pHead->next->val){
pHead = pHead->next;
}
return deleteDuplication(pHead->next);
}
else{
pHead->next = deleteDuplication(pHead->next);
return pHead;
}
}
};