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实现动态添加类的属性或成员函数的解决方法
Jul 16 Python
python处理二进制数据的方法
Jun 03 Python
在Django中创建动态视图的教程
Jul 15 Python
简介Python设计模式中的代理模式与模板方法模式编程
Feb 02 Python
python 写的一个爬虫程序源码
Feb 28 Python
Python实现通过文件路径获取文件hash值的方法
Apr 29 Python
python 使用sys.stdin和fileinput读入标准输入的方法
Oct 17 Python
django项目用higcharts统计最近七天文章点击量
Aug 17 Python
python统计指定目录内文件的代码行数
Sep 19 Python
Python基于pyecharts实现关联图绘制
Mar 27 Python
详解Pycharm与anaconda安装配置指南
Aug 25 Python
python数据分析之用sklearn预测糖尿病
Apr 22 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缓存类代码
2015/10/23 PHP
PHP5.3新特性小结
2016/02/14 PHP
thinkPHP5框架分页样式类完整示例
2018/09/01 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
js滚动条多种样式,推荐
2007/02/05 Javascript
用jquery实现下拉菜单效果的代码
2010/07/25 Javascript
最佳JS代码编写的14条技巧
2011/01/09 Javascript
ajax提交表单实现网页无刷新注册示例
2014/05/08 Javascript
jQuery中append()方法用法实例
2015/01/08 Javascript
详解js中构造流程图的核心技术JsPlumb
2015/12/08 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
jQuery 选择符详细介绍及整理
2016/12/02 Javascript
jquery实现简单的瀑布流布局
2016/12/11 Javascript
JavaScript数据结构之单链表和循环链表
2017/11/28 Javascript
浅谈JavaScript 代码整洁之道
2018/10/23 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
Vue 子组件与数据传递问题及注意事项
2019/07/11 Javascript
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
深入理解javascript prototype的相关知识
2019/09/19 Javascript
layui: layer.open加载窗体时出现遮罩层的解决方法
2019/09/26 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
Python2与python3中 for 循环语句基础与实例分析
2017/11/20 Python
对python使用http、https代理的实例讲解
2018/05/07 Python
解决Mac安装scrapy失败的问题
2018/06/13 Python
python中设置超时跳过,超时退出的方式
2019/12/13 Python
python的slice notation的特殊用法详解
2019/12/27 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
Python 实现微信自动回复的方法
2020/09/11 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
SOA的常见陷阱或者误解是什么
2014/10/05 面试题
总经理人事任命书
2014/06/05 职场文书
小学体育课教学反思
2016/02/16 职场文书
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电