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中的闭包详细介绍和实例
Nov 21 Python
Python实现控制台中的进度条功能代码
Dec 22 Python
python实现猜单词小游戏
May 22 Python
学生信息管理系统Python面向对象版
Jan 30 Python
Django 数据库同步操作技巧详解
Jul 19 Python
Python + Requests + Unittest接口自动化测试实例分析
Dec 12 Python
基于Django实现日志记录报错信息
Dec 17 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
Mar 09 Python
Python爬虫:Request Payload和Form Data的简单区别说明
Apr 30 Python
Python通过Schema实现数据验证方式
Nov 12 Python
python工具——Mimesis的简单使用教程
Jan 16 Python
什么是Python装饰器?如何定义和使用?
Apr 11 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
PHP多线程抓取网页实现代码
2010/07/22 PHP
PHP中改变图片的尺寸大小的代码
2011/07/17 PHP
php简单获取文件扩展名的方法
2015/03/24 PHP
php实现从上传文件创建缩略图的方法
2015/04/02 PHP
解析WordPress中函数钩子hook的作用及基本用法
2015/12/22 PHP
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
PHP简单创建压缩图的方法
2016/08/24 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
2009/05/25 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
php图像生成函数之间的区别分析
2012/12/06 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
javascript中局部变量和全局变量的区别详解
2015/02/27 Javascript
jQuery中on方法使用注意事项详解
2017/02/15 Javascript
js 去掉字符串前后空格实现代码集合
2017/03/25 Javascript
JS ES6多行字符串与连接字符串的表示方法
2017/04/26 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
Angular17之Angular自定义指令详解
2018/01/21 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
bootstrap实现tab选项卡切换
2020/08/09 Javascript
windows下python之mysqldb模块安装方法
2017/09/07 Python
python发送多人邮件没有展示收件人问题的解决方法
2019/06/21 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
Python识别处理照片中的条形码
2020/11/16 Python
CSS3中的5个有趣的新技术
2009/04/02 HTML / CSS
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
单身旅行者的单身假期:Just You
2018/04/08 全球购物
中学教师岗位职责
2013/11/26 职场文书
会计找工作求职信范文
2013/12/09 职场文书
大班上学期个人总结
2015/02/13 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
浅谈PostgreSQL表分区的三种方式
2021/06/29 PostgreSQL
C站最全Python标准库总结,你想要的都在这里
2021/07/03 Python
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL