从已排序的链接列表中删除重复的元素

时间:2013-05-04 13:54:17

标签: c algorithm singly-linked-list

我正在尝试一个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;
}

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

6 个答案:

答案 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