c++ - 没有重复的链表

标签 c++ data-structures linked-list

我有以下代码(适合我的简单测试)用于无重复的链表,但我认为它有点难看。

谁能推荐一种更简洁的方法来处理重复代码? 当前的问题是:

if( (val == cur->val) || (cur->next && (val == cur->next->val)) )

但我认为使用比较运算符的不同用法可能存在更好的解决方案(我没有看到)。

此外,有人可以给我一个“有用的”断言或在此处的建议。很难判断何时断言,尤其是当您有 if 语句为您做断言时。

struct Node 
{
    Node(int v):val(v),next(NULL){}
    int val;
    Node * next;
};

void insert(Node ** ppHead, const int val)
{
    if(ppHead == NULL)
        return;
    if(*ppHead == NULL || val < (*ppHead)->val)
    {
        Node * tmp = new Node(val); // new throws
        tmp->next = *ppHead;
        *ppHead = tmp;
    }
    else
    {
        Node * cur = *ppHead;
        while(cur->next && (val > cur->next->val))
            cur = cur->next;

        if( (val == cur->val) || (cur->next && (val == cur->next->val)) )
            return;

        Node * tmp = new Node(val); // new throws
        tmp->next = cur->next;
        cur->next = tmp;
    }
    return;
}


int _tmain(int argc, _TCHAR* argv[])
{
    Node * list = NULL;
    int x[] = { 5, 4, 6, 7, 1, 8, 1, 8, 7, 2, 3, 0, 1, 0, 4, 9, 9 };
    int size = sizeof(x) / sizeof(x[0]);
    for(int i = 0; i < size; i++)
        insert(&list, x[i]);
    Node * cur = list;
    while(cur) {
        printf (" %d", cur->val);
        cur = cur->next;
    }
    printf("\n");
    return 0;
}

最佳答案

我会这样写:

void insert(Node ** ppHead, const int val)
{
    if (ppHead == NULL)
        return;
    while (*ppHead && (*ppHead)->val < val)
        ppHead = &(*ppHead)->next;
    if (*ppHead && (*ppHead)->val == val)
        return;
    Node * tmp = new Node(val); // new throws
    tmp->next = *ppHead;
    *ppHead = tmp;
}

关于c++ - 没有重复的链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1364165/

相关文章:

c++ - 如何使用局部变量作为 MySQL 查询的一部分 (Qt C++)

c++ - Trie删除不成功

pointers - clojure中的指针循环

java - 在链表中查找大写字母并返回包含找到的元素的新链表?

c - 在不交换数据的情况下交换链表中的节点

c++ - CPP 字符串的字符串分词器?

c++ - 三个 std::complex 特化和 noexcept

c++ - 如何检查QImage是否有效?

c - 我无法 typedef 指向已进行 typedef 编辑的结构的指针

c - 使用基于指针的条件时,即使循环条件为零,循环条件是否也有效?