程序员代码面试指南 2.13:删除无序链表中值重复出现的节点

解法一:哈希

1、思路

  • 遍历链表的过程中,将元素的值存入哈希表内,遇到相同值的节点跳过即可;

  • 时间复杂度 ,空间复杂度

list_node * remove_rep(list_node * head)
{
    if (head == nullptr || head->next == nullptr) return head;

    unordered_set<int> set;
    auto pre = head, cur = head->next;

    set.insert(head->val);              //头结点不会被删除,先存入哈希表中
    while (cur != nullptr)
    {
        if (set.find(cur->val) != set.end())
        {
            pre->next = cur->next;      //跳过当前节点
        }
        else
        {
            set.insert(cur->val);
            pre = cur;
        }

        cur = cur->next;
    }

    return head;
}

解法二:选择排序法

1、思路

  • 类似选择排序的过程,对于每个节点,检查后面链表中是否有相同值的节点;

  • 时间复杂度 ,空间复杂度 。该方法会TLE。

list_node * remove_rep(list_node * head)
{
    list_node *cur = head, *pre = nullptr, *next = nullptr;

    while (cur != nullptr)      //对每一个cur节点,删除链表后半部分中所有与之相同的节点
    {
        pre = cur, next = cur->next;
        while (next != nullptr)
        {
            if (cur->val == next->val)
            {
                pre->next = next->next;
            }
            else
            {
                pre = next;
            }

            next = next->next;
        }

        cur = cur->next;
    }

    return head;
}

主要是为左程云的《程序员代码面试指南》这本书改写C++版的题解。

全部评论

相关推荐

06-26 22:20
门头沟学院 Java
码农索隆:让你把简历发给她,她说一些套话,然后让你加一个人,说这个人给你改简历,然后开始卖课
我的求职精神状态
点赞 评论 收藏
分享
06-11 17:39
门头沟学院 Java
小呆呆的大鼻涕:卧槽,用户彻底怒了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务