本题目摘自《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:如何从无序链表中移除重复项的更多相关文章

  1. python经典面试算法题1.4:如何对链表进行重新排序

    本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.4 对链表按照如下要求重新排序 [微软笔试题] 难度系数: ...

  2. python经典面试算法题1.1:如何实现链表的逆序

    本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.1 如何实现链表的逆序 [腾讯笔试题] 难度系数:⭐⭐⭐ ...

  3. python经典面试算法题1.3:如何计算两个单链表所代表的数之和

    本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.2 如何实现链表的逆序 [华为笔试题] 难度系数:⭐⭐⭐ ...

  4. python经典面试算法题4.1:如何找出数组中唯一的重复元素

    本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. [百度面试题] 难度系数:⭐⭐⭐ 考察频率:⭐⭐⭐⭐ 题目描述 ...

  5. C++经典面试算法题

    转自:http://blog.csdn.net/f_r_e_e_x/article/details/50770907 //1.实现strcpy. char* MyStrCpy( char *pDest ...

  6. 【python cookbook】【数据结构与算法】10.从序列中移除重复项且保持元素间顺序不变

    问题:从序列中移除重复的元素,但仍然保持剩下的元素顺序不变 解决方案: 1.如果序列中的值时可哈希(hashable)的,可以通过使用集合和生成器解决.

  7. python 经典排序算法

    python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...

  8. 合并K个有序数组(链表)【字节跳动面试算法题】

    本题是本人字节跳动一面考的算法题原题是有序数组,一时没想到怎么解决数组的问题,但是如果给的是有序链表数组,则可以用下面的方法解决 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创 ...

  9. 剑指offer中经典的算法题之从头到尾打印链表

    话不多说上代码: 我自己的算法是: /** * public class ListNode { * int val; * ListNode next = null; * * ListNode(int ...

随机推荐

  1. Java的动手动脑

    动手动脑及课后实 仔细阅读示例: EnumTest.java,运行它,分析运行结果? public class EnumTest { public static void main(String[] ...

  2. MFC下使用Mysql

    MFC工程需要使用Mysql数据库中遇到的问题记录下. 1.首先去官网下载下Mysql安装包,安装下Mysql. 我在这边下载的是mysql-installer-community-5.7.16.0. ...

  3. Maven插件构建Docker镜像

    背景 微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上.单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网 ...

  4. 由一次线上故障来理解下 TCP 三握、四挥 & Java 堆栈分析到源码的探秘

    本文导读: 生产故障场景介绍 TCP 建连三次握手过程 TCP 断连四次挥手过程 结合 Java 堆栈剖析源码 再从堆栈中找到"罪魁祸首" 问题优化方案总结 1.生产故障场景介绍 ...

  5. Python3入门机器学习经典算法与应用☝☝☝

    Python3入门机器学习经典算法与应用 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 使用新版python3语言和流行的scikit-learn框架,算法与 ...

  6. Linxu下Yii2的POST请求被拒经历

    Linxu下Yii2的POST提交被拒经历 介于对Yii2的使用,浅谈一下自己的经验,在以往的项目中我使用的框架是Yii1,由于Yii2的出现,所以极力的想使用一下它的新特性. 我的使用环境Linux ...

  7. DJango配置mysql数据库以及数据库迁移

    DJango配置mysql数据库以及数据库迁移 一.Django 配置MySQL数据库 在settings.py中配置 import pymysql # 配置MySQL pymysql.install ...

  8. caffe中softmax源码阅读

    (1) softmax函数                                      (1) 其中,zj 是softmax层的bottom输入, f(zj)是softmax层的top输 ...

  9. Spring 基础知识学习

    Spring 总结 在Spring框架的发布版本中,共包含了20个不同的模块,可以划分为6类不同的功能. Spring整体架构图 为了降低Java开发的复杂性,Spring采取了以下4种关键策略: 基 ...

  10. solr学习篇(二) solr 分词器篇

    关于solr7.4搭建与配置可以参考 solr7.4 安装配置篇  在这里我们探讨一下分词的配置 目录 关于分词 配置分词 验证成功 1.关于分词 1.分词是指将一个中文词语拆成若干个词,提供搜索引擎 ...