我正在尝试一个C程序从Sorted链表中删除重复项,我正在使用从起始节点遍历列表的简单概念。遍历时,将每个节点与其下一个节点进行比较。如果下一个节点的数据与当前节点相同,则我删除下一个节点。
我的代码是:
struct node *remove_dup(struct node *start)
{
struct node *p,*tmp;
p=start;
while(p!=NULL)
{
if(p->info==p->link->info)
{
tmp=p->link;
p->link=p->link->link;
free(tmp);
}
p=p->link;
}
return start;
}
它没有给我正确的答案!我的执行有什么问题?我的观念错了吗?
答案 0 :(得分:4)
由于您的代码会检查下一个元素,因此您需要在最后一个元素之前停止,如下所示:
while (p != NULL && p->link != NULL) {
...
}
获得条件第一部分的唯一原因是捕获空列表。
此外,删除元素时不应使指针前进。否则,您将无法正确处理两个以上元素的运行。
答案 1 :(得分:2)
struct node *remove_dup(struct node *start)
{
struct node *p,*next;
for(p=start; p; p = next) {
next = p->link;
if( !next || p->info != next->info) continue;
p->link = next->link;
free(next);
next = p;
}
return start;
}
或等效的(没有乱搞下一个)
struct node *remove_dup(struct node *start)
{
struct node *p;
for(p=start; p; ) {
struct node *next = p->link;
if( !next || p->info != next->info) { p = next; continue; }
p->link = next->link;
free(next);
}
return start;
}
答案 2 :(得分:1)
void removeDuplicate()
{
if(head == NULL)
return;
Node<T>* pPre = head;
Node<T>* pCur = pPre->pNext;
while (pCur != NULL)
{
if(pCur->elemet == pPre->elemet)
{
pPre->pNext = pCur->pNext;
pCur = pPre->pNext;
}
else
{
pPre = pCur;
pCur = pPre->pNext;
}
}
}
我在C ++中的答案。
答案 3 :(得分:0)
我在Java中的回答:
public void removeDuplicate() {
if (first == null) {
throw new NoSuchElementException("The linkedlist contains no nodes.");
}
Node temp = first;
while (temp != null && temp.next != null) {
if (temp.element == temp.next.element) {
temp.next = temp.next.next;
} else {
temp = temp.next;
}
}
}
答案 4 :(得分:0)
我正在处理java中的同样问题,并在最初挣扎之后提出了非常小的解决方案。请看一下。
Node RemoveDuplicates(Node head) {
Node curr = head;
if(head==null)
return head;
while(curr.next!=null){
if(curr.data == curr.next.data)
curr.next = curr.next.next;
else curr = curr.next;
}
return head;
}
答案 5 :(得分:0)
据我所知,您还需要检查最后一个节点是不是最后一个节点。 以下是给出的正确解释和代码: http://www.dscoding.com/2016/11/remove-duplicates-from-sorted-linked.html