从链表C ++中删除重复项

时间:2018-09-06 07:34:08

标签: c++ linked-list

void removeDuplicates(struct Node *start){

    unordered_set<int> seen;

    struct Node *curr = start;
    struct Node *prev = NULL;

    while(curr != NULL){

        if(seen.find(curr->data) != seen.end()){
            prev->next = curr->next;
            delete(curr);
        }
        else{
            seen.insert(curr->data);
            prev = curr;
        }

        curr = prev->next;

    }
}

c ++的新手,任何人都可以解释这种情况:

if(seen.find(curr->data) != seen.end())

为什么我们应该只与集合的end()比较,我们不应该只是检查是否已经可以找到集合中的元素吗?

2 个答案:

答案 0 :(得分:1)

  

我们不应该检查是否已经找到集合中的元素吗?

这正是该代码的作用。 std::unordered_set::find返回 iterator 到元素(如果找到),否则返回结束迭代器。

如果数据不在集合中,则执行if语句的else分支,否则,如果它中,则为true分支。

答案 1 :(得分:0)

seen.find(curr->data)将迭代器返回其找到的内容。

如果找不到所请求的内容,它将返回列表中最后一个元素之后的迭代器。这称为seen.end()

因此if正在检查发现的是请求的内容。 (不是集合的结尾)