82. Remove Duplicates from Sorted List II
Medium
78570FavoriteShare
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
Example 1:
Input: 1->2->3->3->4->4->5 Output: 1->2->5
Example 2:
Input: 1->1->1->2->3 Output: 2->3
解题思路:
用递归的思路,逐个历遍链表,需要记录当前链表节点和前一个链表节点是否是重复的
答案:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void operate(ListNode* head,ListNode* ans, bool d)
{
if(head==NULL)return;//如果已经到尾部,直接返回
if(head->next==NULL)//如果是最后一个,直接返回
{
ListNode *t=new ListNode(head->val);
ans->next=t;
operate(head->next,t,d);
return;
}
//下面是head和head->next都有值的情况
if(head->val!=head->next->val)
{
if(d)//当前节点与前面的节点不相等,而且当前节点与下一个节点不相等,此时答案中写入当前节点
{
ListNode *t=new ListNode(head->val);
ans->next=t;
operate(head->next,t,d);
return;
}
else //当前节点与前面的节点不相等,但当前节点与下一个节点相等,此时将下一个节点投入继续递归
{
d=true;
operate(head->next,ans,d);
return;
}
}
if(head->val==head->next->val)//当前节点与前面的节点相等
{
if(head->next->next!=NULL)//下一个节点还有值,返回下一个节点
{
d=false;
operate(head->next,ans,d);
return;
}
else return;//已经到达尾部,无需操作,直接返回
}
}
ListNode* deleteDuplicates(ListNode* head) {
bool d=true;
ListNode *ans=new ListNode(0x80000000);//这是个虚拟的头,用来指向最后返回的链表头
operate(head,ans,d);//d用来表示当前链表节点和前一个节点是否有重复
return ans->next;
}
};