作者:也许吧但不是2007029SES | 来源:互联网 | 2024-10-29 19:31
针对已排序的链表,本问题要求删除所有重复的节点,确保每个值仅保留一个实例。例如,在输入链表1-1-2-null的情况下,处理后的结果应为1-2-null。此操作旨在保持链表的有序性同时去除冗余数据。
问题描述:给定一个排序链表,删除所有重复的元素每个元素只留下一个。
样例:
给出 1->1->2->null
,返回 1->2->null。
给出 1->1->2->3->3->null
,返回 1->2->3->null。
解题思路:定义俩个标记数组,初始化两个数组为0,若链表中出现一个元素,用标记数组的下标标记该元素在
链表中出现了几次,若其下标为1,
则该元素只出现了一次,将该元素添加到新的链表中,若下标不为1,则出
现重复,不将该元素添加到新链表中。
实验代码:
class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: head node
*/
ListNode *deleteDuplicates(ListNode *head) {
// write your code here
int xing[1000005],jiu[1000005];
memset(xing,0,sizeof(xing));
memset(jiu,0,sizeof(jiu));
ListNode *q,*p;
p= new ListNode;
q=p;
int j=0;
while(head!=NULL)
{
int k;
k=0;
if(head->val>=0)
{
xing[head->val]++;k=1;
}
else
{
jiu[-(head->val)]++;k=-1;
}
if(k==1&&xing[head->val]==1)
{
p->next=head;
p=head;
}
if(k==-1&&jiu[-(head->val)]==1)
{
p->next=head;
p=head;
}
head=head->next;
}
if(p!=NULL)
p->next=NULL;
if(q==NULL)
return q;
else
return q->next;
}
};
个人感想:链表中元素可能为正也可能为负,需要两个标记数组分别记录正数和负数。