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[] = {};
while (cur) {
if (m[cur->val] > ) {
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;
}
};

最新文章

  1. EF MYSQL 不能选择实体框架版本
  2. [XAF] How to represent an enumeration property via a drop-down box with check boxes
  3. 详细讲解nodejs中使用socket的私聊的方式
  4. mysql 日志文件mysql-bin文件清除方法,和mysql-bin相关文件的配置
  5. SSH相关
  6. 选出N个不重复的随机数
  7. 行转列一定要sum
  8. [Spring] IOC - study
  9. SVN创建Tags
  10. 原生js 实现的瀑布流
  11. Mybatis下配置调用Oracle自定义函数返回的游标结果集
  12. python2.7中使用mysql (windows XP)
  13. WPS 去掉自动打开的文档漫游和在线模板
  14. sql查询每门课程成绩最高的学生
  15. java中 SSL认证和keystore使用
  16. 如何做Gibbs采样(how to do gibbs-sampling)
  17. drupal 7.23 上传中文命名文件bug
  18. Linux常用命令总结——文件管理
  19. Java之路第一步——第一行Java代码
  20. Android项目中独立Git项目分库后的编译调试时Gradle的配置

热门文章

  1. win7 解决git clone 连接被拒绝—hosts文件过期
  2. 如何写BaseDomain
  3. 解决Spring4 MVC请求json数据报406错误
  4. .bat脚本基本命令语法
  5. mysql由浅入深探究(一)----数据库简介与mysql安装
  6. facebook开源前端UI框架React初探
  7. A daemon process class in python
  8. 【开学季】自学嵌入式开发|四核开发板|4412开发板|ARM+Android+linux技术
  9. OpenXml 入门----OpenXml Tools使用技巧
  10. Fisker大师用ZBrush制作兽人萨尔全过程