题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路1:非递归
1、新建一个头节点,防止被删除节点位于头节点;
2、定义两个指针,pre用于指向不重复的节点,last用于判断重复的节点
/*
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;
ListNode* head = new ListNode(-1); //新建一个头节点,防止头结点万一要被删除
head->next = pHead;
ListNode* pre=head; //指向确定不重复的节点
ListNode* last=head->next; //工作指针,用于判断重复节点
while (last!= nullptr){
if(last->next!= nullptr && last->val == last->next->val){
while (last->next!= nullptr && last->val==last->next->val){ //找到最后一个相同的节点
last=last->next;
}
pre->next=last->next;
last=last->next;
} else{
pre = pre->next;
last = last->next;
}
}
return head->next; //【注:文中未delete内存释放】
}
};
思路2:递归
class Solution {
public:
ListNode *deleteDuplication(ListNode *pHead) {
if (pHead == nullptr || pHead->next == nullptr) { // 只有0个或1个结点,则返回
return pHead;
}
if (pHead->val == pHead->next->val) { // 当前结点是重复结点
ListNode* node = pHead->next;
while (node != nullptr && node->val == pHead->val) {
node = node->next; // 跳过值与当前结点相同的全部结点,找到第一个与当前结点不同的结点
}
return deleteDuplication(node); // 从第一个与当前结点不同的结点开始递归
} else { // 当前结点不是重复结点
pHead->next = deleteDuplication(pHead->next); // 保留当前结点,从下一个结点开始递归
return pHead;
}
}
};