python经典面试算法题1.2:如何从无序链表中移除重复项
本题目摘自《Python程序员面试算法宝典》,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中。
1.2 如何实现链表的逆序
【蚂蚁金服面试题】
难度系数:⭐⭐⭐
考察频率:⭐⭐⭐⭐
题目描述:
给定一个没有排序的链表,去掉其重复项,并保留原顺序,例如链表1 -> 3 -> 1 -> 5 -> 5 -> 7,去掉重复项后变成 1-> 3 -> 5 -> 7
方法一:双重循环
我们从头结点往后以此判断每一个结点,即每一个结点从该结点都往后遍历一遍,往后遍历的过程中,如果有结点和当前结点的值相同,就把这个结点删除掉。
class Node: # 定义一个结点类,每一个结点都有data和next
def __init__(self, data=None):
self.data = data
self.next = None
def remove(first_node): # 这个函数接受的参数是,如果是有头结点的链表传入head.next,没头结点的链表传入head
p = first_node
while p is not None and p.next is not None: # and前面的条件控制了first_node是空的时候进不来
q = p.next # and后面的条件控制了到最后一个元素能够结束
prev = p
while q is not None: # 到最后一个结点还会进行比较一次,
if q.data == p.data: # 如果相等
prev.next = q.next # 直接删掉q
else: # 不相等的时候prev向后移动一个
prev = q
q = q.next
p = p.next
# 测试
data_list = [1, 3, 1, 5, 5, 7]
head = Node(1)
p = head
for data in data_list[1:]: # 按照data_list生成一个单链表
p.next = Node(data)
p = p.next
first_node = head
print("删除前: ", end=' ')
while first_node is not None: # 打印出每一个结点
print(first_node.data, end='\t')
first_node = first_node.next
print()
first_node = head
remove(first_node) # 把重复的结点删除
first_node = head
print("删除后: ", end=' ')
while first_node is not None: # 打印出删除之后的各个结点
print(first_node.data, end='\t')
firtst_node = first_node.next
# 程序输出
删除前: 1 3 1 5 5 7
删除后: 1 3 5 7
这种双重循环的方法的时间复杂度是O(n^2),相对来说比较慢。
方法二:时间换空间
我们还有一种思路就是,用一个查询很快的容器盛放我们遍历过的结点,如果当前结点在容器中,那么当前结点已经出现过了,就可以把当前结点删除掉,我们可以选用集合set来当作这个容器。
class Node:
def __init__(self, data):
self.data = data
self.next = None
def remove(first_node): # 传参和上面的是一样的
if not first_node.data:
return None
p = first_node.next
s = {first_node.data} # 第一个
prev = first_node
while p is not None:
if p.data in s:
prev.next = p.next
else:
s.add(p.data)
prev = p
p = p.next
# 测试
data_list = [1, 3, 1, 5, 5, 7]
head = Node(1)
p = head
for data in data_list[1:]: # 按照data_list生成一个单链表
p.next = Node(data)
p = p.next
first_node = head
print("删除前: ", end=' ')
while first_node is not None: # 打印出每一个结点
print(first_node.data, end='\t')
first_node = first_node.next
print()
first_node = head
remove(first_node) # 把重复的结点删除
first_node = head
print("删除后: ", end=' ')
while first_node is not None: # 打印出删除之后的各个结点
print(first_node.data, end='\t')
first_node = first_node.next
程序运行结果:
删除前: 1 3 1 5 5 7
删除后: 1 3 5 7
这样我们增加了一个set的空间,但是我们把时间复杂度从O(n^2)直接提到了O(n)。
if hasattr(reader, "QQ"):
print(f"请{reader}加入交流群:6259 88679 !")
python经典面试算法题1.2:如何从无序链表中移除重复项的更多相关文章
- python经典面试算法题1.4:如何对链表进行重新排序
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.4 对链表按照如下要求重新排序 [微软笔试题] 难度系数: ...
- python经典面试算法题1.1:如何实现链表的逆序
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.1 如何实现链表的逆序 [腾讯笔试题] 难度系数:⭐⭐⭐ ...
- python经典面试算法题1.3:如何计算两个单链表所代表的数之和
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.2 如何实现链表的逆序 [华为笔试题] 难度系数:⭐⭐⭐ ...
- python经典面试算法题4.1:如何找出数组中唯一的重复元素
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. [百度面试题] 难度系数:⭐⭐⭐ 考察频率:⭐⭐⭐⭐ 题目描述 ...
- C++经典面试算法题
转自:http://blog.csdn.net/f_r_e_e_x/article/details/50770907 //1.实现strcpy. char* MyStrCpy( char *pDest ...
- 【python cookbook】【数据结构与算法】10.从序列中移除重复项且保持元素间顺序不变
问题:从序列中移除重复的元素,但仍然保持剩下的元素顺序不变 解决方案: 1.如果序列中的值时可哈希(hashable)的,可以通过使用集合和生成器解决.
- python 经典排序算法
python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...
- 合并K个有序数组(链表)【字节跳动面试算法题】
本题是本人字节跳动一面考的算法题原题是有序数组,一时没想到怎么解决数组的问题,但是如果给的是有序链表数组,则可以用下面的方法解决 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创 ...
- 剑指offer中经典的算法题之从头到尾打印链表
话不多说上代码: 我自己的算法是: /** * public class ListNode { * int val; * ListNode next = null; * * ListNode(int ...
随机推荐
- 我的Java秋招面经大合集
阿里面经 阿里中间件研发面经 蚂蚁金服研发面经 岗位是研发工程师,直接找蚂蚁金服的大佬进行内推. 我参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer. 然后我也参加了 ...
- Java11月18日
动手动脑 实验一: 1. 下边的程序运行结果是什么? 2.你如何解释会得到这样的输出? 3.计算机是不会出错的,之所以得到这样的运行结果也是有原因的那么从这些运行结果中,你能总结出Java的哪些语法特 ...
- Linux之常用命令II
一.VI编辑器 1) 概述 ◆ Visual Interface(可视化接口): ◆ 类似Windows中的记事本,比记事本强大: ◆ VIM相对于VI做了哪些提升 -VIM支持多级撤销 -VI ...
- 洛谷P1608 路径计数
题目简介 题目描述 给你一个N点M边的有向图,求第一个点到第n个点的最短路和最短路条数 题目分析 很明显直接Dijkstra求最短路,加一个最短路计数 如下: if(dis[y]>dis[x]+ ...
- PHP reset
1.函数的作用:重置数组内部指针,并返回第一个元素 2.函数的参数: @param array $array 3. 例子一: <?php $arr1 = []; $arr2 = [false, ...
- GDAL集成对KML文件的支持
目录 1. 正文 1.1. 编译LibKML 1.1.1. 第三方库支持 1.1.2. 编译错误 1.2. 配置GDAL 1.3. 链接问题 2. 参考 1. 正文 GDAL可以支持将KML作为矢量文 ...
- 概念理解:boost::asio::io_service
IO模型 io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象). asio::io_service i ...
- 谢宝友: 手把手教你给Linux内核发patch
本文系转载,著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 谢宝友 来源: 微信公众号 linux阅码场 (id: linuxdev) 本文简介 本文一步一 ...
- 【Spring Cloud】微服务架构选型方案
1.技术架构 2.组件介绍 1.服务注册与发现——Eureka 服务注册与发现中心采用Eureka,以AP为核心的高可用注册中心,保证高可用性和最终一致性,server之间互相注册的replicate ...
- Knative 实战:如何在 Knative 中配置自定义域名及路由规则
作者 | 元毅 阿里云智能事业群高级开发工程师 当前 Knative 中默认支持是基于域名的转发,可以通过域名模板配置后缀,但目前对于用户来说并不能指定全域名设置.另外一个问题就是基于 Path 和 ...