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写的一个文本编辑器
Jan 23 Python
简单介绍Python中用于求最小值的min()方法
May 15 Python
实例Python处理XML文件的方法
Aug 31 Python
Python中模块与包有相同名字的处理方法
May 05 Python
Python Web程序部署到Ubuntu服务器上的方法
Feb 22 Python
Python读取Word(.docx)正文信息的方法
Mar 15 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
使用Python 统计高频字数的方法
Jan 31 Python
VSCode Python开发环境配置的详细步骤
Feb 22 Python
Django上线部署之IIS的配置方法
Aug 22 Python
Python OpenCV图像指定区域裁剪的实现
Oct 30 Python
Python通过fnmatch模块实现文件名匹配
Sep 30 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设计模式 Builder(建造者模式)
2011/06/26 PHP
PHP的curl实现get,post和cookie(实例介绍)
2013/06/17 PHP
使用Sphinx对索引进行搜索
2013/06/25 PHP
php算法实例分享
2015/07/14 PHP
javascript jQuery插件练习
2008/12/24 Javascript
Javascript 自定义类型方法小结
2010/03/02 Javascript
js父页面中使用子页面的方法
2016/01/09 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
vue实现个人信息查看和密码修改功能
2018/05/06 Javascript
vue+springboot实现项目的CORS跨域请求
2018/09/05 Javascript
vue自定义指令的创建和使用方法实例分析
2018/12/04 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
微信小程序入门之指南针
2020/10/22 Javascript
vue+Element-ui实现分页效果
2020/11/15 Javascript
python用reduce和map把字符串转为数字的方法
2016/12/19 Python
Python分治法定义与应用实例详解
2017/07/28 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
Python实现PS图像调整之对比度调整功能示例
2018/01/26 Python
Python对List中的元素排序的方法
2018/04/01 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
详解html5 shiv.js和respond.min.js
2018/01/24 HTML / CSS
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
大学生预备党员自我评价分享
2013/11/16 职场文书
优秀应届毕业生自荐信
2013/11/16 职场文书
中介公司区域经理岗位职责范本
2014/03/02 职场文书
验房委托书
2014/08/30 职场文书
师德师风建设整改措施思想汇报
2014/10/11 职场文书
骨干教师事迹材料
2014/12/17 职场文书
家长意见和建议怎么写
2015/06/04 职场文书
南极大冒险观后感
2015/06/05 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
SpringCloud超详细讲解Feign声明式服务调用
2022/06/21 Java/Android