3

我正在尝试使用 C 程序从排序的链表中删除重复项,并且我正在使用从起始节点遍历列表的简单概念。遍历时,将每个节点与其下一个节点进行比较。如果下一个节点的数据与当前节点相同,那么我删除下一个节点。

我的代码是:

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;
}

它没有给我正确的答案!我的执行有什么问题?我的概念错了吗?

4

6 回答 6

4

由于您的代码检查下一个元素,因此您需要在前一个元素处停止,如下所示:

while (p != NULL && p->link != NULL) {
    ...
}

具有条件的第一部分的唯一原因是捕获空列表。

此外,您不应该在删除元素时使指针前进。否则,您将无法正确处理超过两个元素的运行。

于 2013-05-04T13:56:49.190 回答
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;
}
于 2013-05-04T14:57:45.877 回答
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++ 中的回答。

于 2013-08-26T01:49:36.147 回答
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;
        }
    }
}
于 2013-08-26T00:27:53.547 回答
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;
}
于 2015-08-07T02:56:28.810 回答
0

根据我的说法,您最后还需要检查您的当前节点是否不是最后一个节点。这是给出的正确解释和代码: http ://www.dscoding.com/2016/11/remove-duplicates-from-sorted-linked.html

于 2016-11-15T12:20:48.273 回答