python无序链表删除重复项的方法


Posted in Python onJanuary 17, 2020

题目描述:

给定一个没有排序的链表,去掉重复项,并保留原顺序 如: 1->3->1->5->5->7,去掉重复项后变为:1->3->5->7

方法:

  1. 顺序删除
  2. 递归删除

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

结果:

python无序链表删除重复项的方法

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

结果:

python无序链表删除重复项的方法

引申:从有序链表中删除重复项

上述介绍的方法也适用于链表有序的情况,但是由于上述方法没有充分利用到链表有序这个条件,因此,算法的性能肯定不是最优的。本题中,由于链表具有有序性,因此不需要对链表进行两次遍历。所以有如下思路:
用cur指向链表的第一个结点,此时需要分为以下两种情况讨论:

  • 如果cur.data == cur.next.data,则删除cur.next结点;
  • 如果cur.data != cur.next.data,则cur=cur.next,继续遍历其余结点;

总结

以上所述是小编给大家介绍的python无序链表删除重复项的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python 文件操作实现代码
Oct 07 Python
Python中面向对象你应该知道的一下知识
Jul 10 Python
如何通过python的fabric包完成代码上传部署
Jul 29 Python
Python爬虫 bilibili视频弹幕提取过程详解
Jul 31 Python
python selenium爬取斗鱼所有直播房间信息过程详解
Aug 09 Python
通过实例了解python property属性
Nov 01 Python
python读取ini配置的类封装代码实例
Jan 08 Python
Tensorflow之梯度裁剪的实现示例
Mar 08 Python
python with语句的原理与用法详解
Mar 30 Python
python Django 反向访问器的外键冲突解决
May 20 Python
python程序需要编译吗
Jun 19 Python
教你怎么用Python监控愉客行车程
Apr 29 Python
Python实现投影法分割图像示例(一)
Jan 17 #Python
np.dot()函数的用法详解
Jan 17 #Python
python使用numpy实现直方图反向投影示例
Jan 17 #Python
对python中 math模块下 atan 和 atan2的区别详解
Jan 17 #Python
python 计算方位角实例(根据两点的坐标计算)
Jan 17 #Python
Python autoescape标签用法解析
Jan 17 #Python
flask利用flask-wtf验证上传的文件的方法
Jan 17 #Python
You might like
如何选购合适的收音机
2021/03/01 无线电
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
destoon二次开发入门示例
2014/06/20 PHP
php数组添加元素方法小结
2014/12/20 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
php依赖注入知识点详解
2019/09/23 PHP
javascript 日期时间 转换的方法
2013/02/21 Javascript
jQuery页面加载初始化常用的三种方法
2014/06/04 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
详解JavaScript的策略模式编程
2015/06/24 Javascript
js模仿php中strtotime()与date()函数实现方法
2015/08/11 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
微信小程序开发之IOS和Android兼容的问题
2017/09/26 Javascript
React根据宽度自适应高度的示例代码
2017/10/11 Javascript
JS开发中基本数据类型具体有哪几种
2017/10/19 Javascript
JavaScript html5 canvas实现图片上画超链接
2017/10/20 Javascript
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
2020/11/24 Javascript
[40:50]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第四场
2014/05/24 DOTA
[14:25]教你分分钟做大人:主宰(HEROS)
2014/12/08 DOTA
[01:30:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第二场 2月2日
2021/03/11 DOTA
Python中的类学习笔记
2014/09/23 Python
python实现颜色rgb和hex相互转换的函数
2015/03/19 Python
解析python的局部变量和全局变量
2019/08/15 Python
flask 实现token机制的示例代码
2019/11/07 Python
对python中assert、isinstance的用法详解
2019/11/27 Python
详解用python -m http.server搭一个简易的本地局域网
2020/09/24 Python
小结Python的反射机制
2020/09/28 Python
python 从list中随机取值的方法
2020/11/16 Python
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
医院总经理岗位职责
2014/02/04 职场文书
迎国庆演讲稿
2014/09/15 职场文书
中班下学期个人总结
2015/02/12 职场文书
canvas 中如何实现物体的框选
2022/08/05 Javascript