当前位置: 首页 > news >正文

[CareerCup] 2.1 Remove Duplicates from Unsorted List 移除无序链表中的重复项

2.1 Write code to remove duplicates from an unsorted linked list.
FOLLOW UP
How would you solve this problem if a temporary buffer is not allowed?

这道题让我们移除无序链表中的重复项,在LeetCode中有两道类似的题是Remove Duplicates from Sorted List 移除有序链表中的重复项 和 Remove Duplicates from Sorted List II 移除有序链表中的重复项之二。这两道都是针对有序链表的,而这道题是针对无序链表的,其实难度也不是很大。很多对于链表的处理的题都需要在头结点前建立一个dummy node,目的是为了防止头结点被移除,没法返回新的头结点位置。而这道题不用,因为此题让我们删除重复的节点,不是全删掉,而是会保留一个,那么不管头结点有没有重复项,都会保留下来。这题我们可以用哈希表来解,思路是对于每一个节点,如果在哈希表中存在,则删掉,若不存在,则加入哈希表,参见代码如下:

class Solution {
public:
    ListNode *deleteDuplicates(ListNode *head) {
        ListNode *pre = NULL, *cur = head;
        int m[256] = {0};
        while (cur) {
            if (m[cur->val] > 0) {
                pre->next = cur->next;
            } else {
                ++m[cur->val];
                pre = cur;
            }
            cur = cur->next;
        }
        return head;
    }
};

这道题的Follow Up让我们不要用额外空间,即空间复杂度应为O(1),那么我们需要两个while循环来解,同时需要两个指针,第一个指针指向一个节点,第二个指针从下一个为位置开始遍历到链表末尾,遇到相同的就删掉。以此类推直到第一个指针完成链表的遍历即可删掉所有的重复项,整体的思路和冒泡排序有些类似,但是这种方法的时间复杂度为O(n2),是一种以时间来换取空间的方法,参见代码如下:

class Solution {
public:
    ListNode *deleteDuplicates(ListNode *head) {
        ListNode *pre = head, *cur = head;
        while (pre) {
            cur = pre->next;
            while (cur) {
                if (cur->val == pre->val) {
                    pre->next = cur->next;
                }
                cur = cur->next;
            }
            pre = pre->next;
        }
        return head;
    }
};

本文转自博客园Grandyang的博客,原文链接:移除无序链表中的重复项[CareerCup] 2.1 Remove Duplicates from Unsorted List ,如需转载请自行联系原博主。

相关文章:

  • AutoScaling伸缩组伸缩模式之停机回收模式
  • adafruit 的 Lady Bug (小瓢虫)
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 一个.net下的轻量级的Serverless 文档数据库LiteDB
  • 微信小程序开发问题汇总
  • 基于我的Winform开发框架扩展而成的WCF开发框架
  • 「面试题」如何实现一个圣杯布局?
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • 预加载机制及变量提升
  • proguaid混淆maven工程问题总结
  • 图片编辑类
  • tcpdump
  • UGUI
  • mysql -- 优化之ICP(index condition pushdown)
  • 感恩送书第1期:2019年快来了,感谢各位网友,送《Spring 5开发大全》
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Apache Zeppelin在Apache Trafodion上的可视化
  • java8 Stream Pipelines 浅析
  • MySQL数据库运维之数据恢复
  • PHP 的 SAPI 是个什么东西
  • SQLServer插入数据
  • uva 10370 Above Average
  • Web标准制定过程
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 用element的upload组件实现多图片上传和压缩
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • C# - 为值类型重定义相等性
  • # 数据结构
  • (floyd+补集) poj 3275
  • (LeetCode 49)Anagrams
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (一一四)第九章编程练习
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .htaccess配置常用技巧
  • .NET CLR基本术语
  • .NET Core 中的路径问题
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net MVC中使用angularJs刷新页面数据列表
  • .net 设置默认首页
  • .NetCore 如何动态路由
  • .net网站发布-允许更新此预编译站点
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • /etc/fstab和/etc/mtab的区别
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • [ C++ ] STL---string类的使用指南
  • [Android] Upload package to device fails #2720
  • [android] 请求码和结果码的作用
  • [Android]创建TabBar
  • [ASP]青辰网络考试管理系统NES X3.5
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [bzoj1901]: Zju2112 Dynamic Rankings
  • [ERROR] 不再支持目标选项 5。请使用 7 或更高版本
  • [Fri 26 Jun 2015 ~ Thu 2 Jul 2015] Deep Learning in arxiv