题目描述:

给定一个没有排序的链表,去掉重复项,并保留原顺序 如: 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无序链表删除重复项的方法相关推荐

  1. 单链表-删除重复节点(递增链表)

    单链表的存储结构: typedef struct LinkList{int data;LinkList * next;} 分析: 这里删除重复节点,分两种情况: 1.第一种是链表本身递增的 2.第二种 ...

  2. 删除链表重复节点 python_Word里面如何删除空白页?删除Word空白页的六种方法

    在使用Word办公软件的时候,是否经常遇到Word中多出了一个或多个空白页,而怎么都删除不了?本文就来教大家在Word中如何删除空白页. 因为导致Word空白页的问题很多,下面总结了六种删除Word空 ...

  3. 【链表】两个无序链表合并成递增有序链表(利用原表空间)

    思路: 1.排序 先将两个链表从小到大排序,调整成两个有序链表. 2.合并 使用两个工作指针PA和PB分别从两个表头开始循环. 当两个工作指针均非空时,如果PA->data大于PB->da ...

  4. 剑指offer:面试题18. 删除链表的节点

    题目:删除链表的节点 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点. 返回删除后的链表的头节点. 注意:此题对比原题有改动 示例 1: 输入: head = [4,5,1,9], ...

  5. 链表之删除链表中间节点

    题目: 链表之删除链表中间节点 思路: 方法1: 我们先得到链表的长度,如果是奇数的话加一除以2,如果是偶数直接除以二,  得到的长度,然后从头结点开始遍历得到的长度前一个节点,然后把它删除   方法 ...

  6. 【算法】剑指 Offer 18. 删除链表的节点

    1.概述 剑指 Offer 18. 删除链表的节点 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点. 返回删除后的链表的头节点. 注意:此题对比原题有改动 示例 1: 输入: he ...

  7. 查找相交链表相交节点

    目录 查找链表相交节点 情况1: 无环链表相交 情况3:链表相交于入环前及入环节点 情况4:链表A.B相交于入环后或不相交 查找链表相交节点 先判断链表A和B是否有环,并分别找到他们的环入口(loop ...

  8. win10下PS(Photoshop)磁性套索工具del键删除不了节点如何解决

    win10中文版只安装了中文语言包,对于只有中文简体键盘微软拼音这种键盘输入法. 这个win10的中文简体键盘微软拼音法,PS在这种输入法下就会出现很多失灵的情况.例如磁性套索工具del键删除不了节点 ...

  9. 【数据结构与算法】 01 链表 (单链表、双向链表、循环链表、块状链表、头结点、链表反转与排序、约瑟夫环问题)

    一.线性表 1.1 概念与特点 1.2 线性表的存储结构 1.3 常见操作 1.4 应用场景 二.链表 2.1 链表简介 2.2 单向链表(单链表) 2.21 基本概念 2.22 单链表基本操作 2. ...

最新文章

  1. linux下apache服务器的配置和管理(启动、重启、中断服务)
  2. (原創) 标准的makefile写法 (C/C++)
  3. spring与memcache的整合
  4. mysql性能监控指标及分析
  5. python propresql mysql_Python中操作mysql的pymysql模块详解
  6. springmvc(17)异步消息简介(部分)
  7. 生成二维码并以图片格式下载-qrcodejs2
  8. 如何为curl命令添加数据?
  9. java linux root权限管理_Linux--开启root用户并允许管理员登录
  10. shell 脚本随机抽取班级学生
  11. MSExchangeIS ID8528 日志提示邮箱已满报警
  12. 分类模型的评价指标--混淆矩阵,ROC曲线,AUC及sklearn.metrics.roc_curve参数说明
  13. java 代码块 构造函数_Java学习笔记之------构造函数,静态关键字,静态代码块,构造代...
  14. 基于Paddlehub与Wechaty的微信小助手--懂懂
  15. 【PX4自动驾驶用户指南】距离传感器
  16. 解决微信授权回调页面域名只能设置一个的问题 [php]
  17. 消防装备管理心得体会
  18. STING 与 cGAS的结合导致TBK1 激酶募集和活化
  19. 企业为何需要在内部推广Devops
  20. 有关球 圆柱 圆锥 的计算

热门文章

  1. pdfstamper生成pdf无法显示汉字_正点原子STM32F4/F7水星开发板资料连载第四十六章 汉字显示实验...
  2. 数据库开发技术java方向_Java开发工程师(Web方向) - 03.数据库开发 - 第5章.MyBatis...
  3. python大数据项目_(价值1280)大数据项目实战之Python金融应用编程
  4. linux 系统arp检测工具,linux网络常用诊断工具
  5. 系统服务器如何给指定磁盘扩容_刀片服务器如何选择操作系统?
  6. vb.net 如何文件指定打印机打印文件_使用Dropbox文件请求配合Canon Inkjet实现多用户文件打印...
  7. 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置
  8. c语言访问数据库 不用odbc,急问ODBC访问数据库问题
  9. Jam's balance HDU - 5616 (01背包基础题)
  10. 怎么调用系统通讯录并向被选中联系人发送短信