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编程中归并排序算法的实现步骤详解
May 04 Python
python 用lambda函数替换for循环的方法
Jun 09 Python
python linecache 处理固定格式文本数据的方法
Jan 08 Python
python实现画循环圆
Nov 23 Python
Python requests获取网页常用方法解析
Feb 20 Python
在jupyter notebook中调用.ipynb文件方式
Apr 14 Python
tensorflow常用函数API介绍
Apr 19 Python
Django表单提交后实现获取相同name的不同value值
May 14 Python
python中rb含义理解
Jun 18 Python
python如何爬取网页中的文字
Jul 28 Python
python MD5加密的示例
Oct 19 Python
Python函数中apply、map、applymap的区别
Nov 27 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
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
2013/06/29 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
CL vs ForZe BO5 第三场 2.13
2021/03/10 DOTA
符合标准的js表单提交的代码
2007/09/13 Javascript
Javascript 变量作用域 两个可能会被忽略的小特性
2010/03/23 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
给before和after伪元素设置js效果的方法
2015/12/04 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
2017/06/22 jQuery
AngularJS 实现点击按钮获取验证码功能实例代码
2017/07/13 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
Angular模版驱动表单的使用总结
2018/05/05 Javascript
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
详解小程序用户登录状态检查与更新实例
2019/05/15 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
python使用在线API查询IP对应的地理位置信息实例
2014/06/01 Python
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
python 列表,数组,矩阵两两转换tolist()的实例
2018/04/04 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
2018/07/13 Python
Python3非对称加密算法RSA实例详解
2018/12/06 Python
浅谈django url请求与数据库连接池的共享问题
2019/08/29 Python
python实现手势识别的示例(入门)
2020/04/15 Python
5 分钟读懂Python 中的 Hook 钩子函数
2020/12/09 Python
怀旧收藏品和经典纪念品:Betty’s Attic
2018/08/29 全球购物
Funko官方商店:源自美国,畅销全球搪胶收藏玩偶
2018/09/15 全球购物
小米官方旗舰店:Xiaomi
2020/08/07 全球购物
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
网上商城创业计划书范文
2014/01/31 职场文书
建筑结构施工专业推荐信
2014/02/21 职场文书
家教广告词
2014/03/19 职场文书
银行委托书范本
2014/04/04 职场文书
在职员工证明书
2014/09/19 职场文书
护士自荐信怎么写
2015/03/06 职场文书
漫画「请问您今天要来点兔子吗?」最新杂志彩页公开
2022/03/24 日漫