删除链表重复节点 python_python无序链表删除重复项的方法
题目描述:
给定一个没有排序的链表,去掉重复项,并保留原顺序 如: 1->3->1->5->5->7,去掉重复项后变为:1->3->5->7
方法:
顺序删除
递归删除
1.顺序删除
由于这种方法采用双重循环对链表进行遍历,因此,时间复杂度为O(n**2)
在遍历链表的过程中,使用了常数个额外的指针变量来保存当前遍历的结点,前驱结点和被删除的结点,所以空间复杂度为O(1)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/1/15 20:55
# @Author : buu
# @Software: PyCharm
# @Blog :https://blog.csdn.net/weixin_44321080
class LNode:
def __init__(self, x):
self.data = x
self.next = None
def removeDup(head):
"""
对带头结点的无序单链表删除重复的结点
顺序删除:通过双重循环直接在链表上进行删除操作
即,外层循环用一个指针从第一个结点开始遍历整个链表,内层循环从外层指针指向的下一个结点开始,
遍历其余结点,将与外层循环遍历到的的指针所指的结点的数据域相同的结点删除
:param head: 头指针
:return:
"""
if head is None or head.next is None:
return
outerCur = head.next
innerCur = None
innerPre = None
while outerCur is not None:
innerCur = outerCur.next
innerPre = outerCur
while innerCur is not None:
if outerCur.data == innerCur.data:
innerPre.next = innerCur.next
innerCur = innerCur.next
else:
innerPre = innerCur
innerCur = innerCur.next
outerCur = outerCur.next
if __name__ == '__main__':
i = 1
head = LNode(6)
tmp = None
cur = head
while i < 7:
if i % 2 == 0:
tmp = LNode(i + 1)
elif i % 3 == 0:
tmp = LNode(i - 2)
else:
tmp = LNode(i)
cur.next = tmp
cur = tmp
i += 1
print("before removeDup:")
cur = head.next
while cur is not None:
print(cur.data, end=' ')
cur = cur.next
removeDup(head)
print("\nafter removeDup:")
cur = head.next
while cur is not None:
print(cur.data, end=' ')
cur = cur.next
结果:
2.递归
此方法与方法一类似,从本质上而言,由于这种方法需要对链表进行双重遍历,所以时间复杂度为O(n**2)
由于递归法会增加许多额外的函数调用,所以从理论上讲,该方法效率比方法一低
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/1/15 21:30
# @Author : buu
# @Software: PyCharm
# @Blog :https://blog.csdn.net/weixin_44321080
class LNode:
def __init__(self, x):
self.data = x
self.next = None
def removeDupRecursion(head):
"""
递归法:将问题逐步分解为小问题,即,对于结点cur,首先递归地删除以cur.next为首
的子链表中重复的结点;接着删除以cur为首的链表中的重复结点,
:param head:
:return:
"""
if head.next is None:
return head
pointer = None
cur = head
head.next = removeDupRecursion(head.next)
pointer = head.next
while pointer is not None:
if head.data == pointer.data:
cur.next = pointer.next
pointer = cur.next
else:
pointer = pointer.next
cur = cur.next
return head
def removeDup(head):
"""
对带头结点的单链表删除重复结点
:param head: 链表头结点
:return:
"""
if head is None:
return
head.next = removeDupRecursion(head.next)
if __name__ == '__main__':
i = 1
head = LNode(6)
tmp = None
cur = head
while i < 7:
if i % 2 == 0:
tmp = LNode(i + 1)
elif i % 3 == 0:
tmp = LNode(i - 2)
else:
tmp = LNode(i)
cur.next = tmp
cur = tmp
i += 1
print("before recursive removeDup:")
cur = head.next
while cur is not None:
print(cur.data, end=' ')
cur = cur.next
removeDup(head)
print("\nafter recurseve removeDup:")
cur = head.next
while cur is not None:
print(cur.data, end=' ')
cur = cur.next
结果:
引申:从有序链表中删除重复项
上述介绍的方法也适用于链表有序的情况,但是由于上述方法没有充分利用到链表有序这个条件,因此,算法的性能肯定不是最优的。本题中,由于链表具有有序性,因此不需要对链表进行两次遍历。所以有如下思路:
用cur指向链表的第一个结点,此时需要分为以下两种情况讨论:
如果cur.data == cur.next.data,则删除cur.next结点;
如果cur.data != cur.next.data,则cur=cur.next,继续遍历其余结点;
总结
以上所述是小编给大家介绍的python无序链表删除重复项的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
删除链表重复节点 python_python无序链表删除重复项的方法相关推荐
- 单链表-删除重复节点(递增链表)
单链表的存储结构: typedef struct LinkList{int data;LinkList * next;} 分析: 这里删除重复节点,分两种情况: 1.第一种是链表本身递增的 2.第二种 ...
- 删除链表重复节点 python_Word里面如何删除空白页?删除Word空白页的六种方法
在使用Word办公软件的时候,是否经常遇到Word中多出了一个或多个空白页,而怎么都删除不了?本文就来教大家在Word中如何删除空白页. 因为导致Word空白页的问题很多,下面总结了六种删除Word空 ...
- 【链表】两个无序链表合并成递增有序链表(利用原表空间)
思路: 1.排序 先将两个链表从小到大排序,调整成两个有序链表. 2.合并 使用两个工作指针PA和PB分别从两个表头开始循环. 当两个工作指针均非空时,如果PA->data大于PB->da ...
- 剑指offer:面试题18. 删除链表的节点
题目:删除链表的节点 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点. 返回删除后的链表的头节点. 注意:此题对比原题有改动 示例 1: 输入: head = [4,5,1,9], ...
- 链表之删除链表中间节点
题目: 链表之删除链表中间节点 思路: 方法1: 我们先得到链表的长度,如果是奇数的话加一除以2,如果是偶数直接除以二, 得到的长度,然后从头结点开始遍历得到的长度前一个节点,然后把它删除 方法 ...
- 【算法】剑指 Offer 18. 删除链表的节点
1.概述 剑指 Offer 18. 删除链表的节点 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点. 返回删除后的链表的头节点. 注意:此题对比原题有改动 示例 1: 输入: he ...
- 查找相交链表相交节点
目录 查找链表相交节点 情况1: 无环链表相交 情况3:链表相交于入环前及入环节点 情况4:链表A.B相交于入环后或不相交 查找链表相交节点 先判断链表A和B是否有环,并分别找到他们的环入口(loop ...
- win10下PS(Photoshop)磁性套索工具del键删除不了节点如何解决
win10中文版只安装了中文语言包,对于只有中文简体键盘微软拼音这种键盘输入法. 这个win10的中文简体键盘微软拼音法,PS在这种输入法下就会出现很多失灵的情况.例如磁性套索工具del键删除不了节点 ...
- 【数据结构与算法】 01 链表 (单链表、双向链表、循环链表、块状链表、头结点、链表反转与排序、约瑟夫环问题)
一.线性表 1.1 概念与特点 1.2 线性表的存储结构 1.3 常见操作 1.4 应用场景 二.链表 2.1 链表简介 2.2 单向链表(单链表) 2.21 基本概念 2.22 单链表基本操作 2. ...
最新文章
- linux下apache服务器的配置和管理(启动、重启、中断服务)
- (原創) 标准的makefile写法 (C/C++)
- spring与memcache的整合
- mysql性能监控指标及分析
- python propresql mysql_Python中操作mysql的pymysql模块详解
- springmvc(17)异步消息简介(部分)
- 生成二维码并以图片格式下载-qrcodejs2
- 如何为curl命令添加数据?
- java linux root权限管理_Linux--开启root用户并允许管理员登录
- shell 脚本随机抽取班级学生
- MSExchangeIS ID8528 日志提示邮箱已满报警
- 分类模型的评价指标--混淆矩阵,ROC曲线,AUC及sklearn.metrics.roc_curve参数说明
- java 代码块 构造函数_Java学习笔记之------构造函数,静态关键字,静态代码块,构造代...
- 基于Paddlehub与Wechaty的微信小助手--懂懂
- 【PX4自动驾驶用户指南】距离传感器
- 解决微信授权回调页面域名只能设置一个的问题 [php]
- 消防装备管理心得体会
- STING 与 cGAS的结合导致TBK1 激酶募集和活化
- 企业为何需要在内部推广Devops
- 有关球 圆柱 圆锥 的计算
热门文章
- pdfstamper生成pdf无法显示汉字_正点原子STM32F4/F7水星开发板资料连载第四十六章 汉字显示实验...
- 数据库开发技术java方向_Java开发工程师(Web方向) - 03.数据库开发 - 第5章.MyBatis...
- python大数据项目_(价值1280)大数据项目实战之Python金融应用编程
- linux 系统arp检测工具,linux网络常用诊断工具
- 系统服务器如何给指定磁盘扩容_刀片服务器如何选择操作系统?
- vb.net 如何文件指定打印机打印文件_使用Dropbox文件请求配合Canon Inkjet实现多用户文件打印...
- 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置
- c语言访问数据库 不用odbc,急问ODBC访问数据库问题
- Jam's balance HDU - 5616 (01背包基础题)
- 怎么调用系统通讯录并向被选中联系人发送短信