删除排序链表中的重复元素 II
时间限制: 1s
类别: DS:数组与链表->链表--较难
问题描述
给定一个已排序的链表的头 head
, 删除原始链表中所有重复数字的节点,只留下不同的数字 。输出结果链表 (所有结点按照原有的顺序排列)。
示例 1:
输入:head = [1,2,3,3,4,4,5] 输出:[1,2,5] 提示: 链表中节点数目在范围 [0, 300] 内 -100 <= Node.val <= 100 题目数据保证链表已经按升序排列
输入说明
输入链表长度n,然后输入n个整数,每个整数在-100到100之间,以空格分隔。
n在[0,300]内。
输出说明
输出格式见范例。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode() : val(0), next(NULL) {}
ListNode(int x) : val(x), next(NULL) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
ListNode *createByTail()
{
ListNode *head;
ListNode *p1,*p2;
int n=0,num;
int len;
cin>>len;
head=NULL;
while(n<len && cin>>num)
{
p1=new ListNode(num);
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
}
return head;
}
ListNode*DeleteRepet(ListNode*A)
{
ListNode*start=new ListNode(0);
start->next=A;
ListNode*pa=A,*prior=start;
while(pa!=nullptr)
{
while(pa->next!=nullptr&&pa->val==pa->next->val)
{
pa=pa->next;
}
if(prior->next!=pa)
{
prior->next=pa->next;
}
else
{
prior=prior->next;
}
pa=pa->next;
}
ListNode*newhead=start->next;
delete start;
return newhead;
}
void printList(ListNode* head)
{
if (!head)
{
cout << "head-->tail" << endl;
return;
}
cout << "head";
while (head)
{
cout << "-->" << head->val;
head = head->next;
}
cout << "-->tail" << endl;
}
int main()
{
ListNode*A=createByTail();
ListNode*newh=DeleteRepet(A);
printList(newh);
return 0;
}