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获取图片颜色信息的方法
Mar 18 Python
在Python的web框架中配置app的教程
Apr 30 Python
Swift中的协议(protocol)学习教程
Jul 08 Python
python3基于TCP实现CS架构文件传输
Jul 28 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
Sep 17 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
May 31 Python
Python如何基于smtplib发不同格式的邮件
Dec 30 Python
深度学习入门之Pytorch 数据增强的实现
Feb 26 Python
在pytorch中实现只让指定变量向后传播梯度
Feb 29 Python
python调用私有属性的方法总结
Jul 24 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 Python
python小型的音频操作库mp3Play
Apr 24 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获取linux服务器状态的代码
2014/05/27 PHP
php中file_exists函数使用详解
2015/05/08 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
html数组字符串拼接的最快方法
2009/09/16 Javascript
基于jquery打造的百分比动态色彩条插件
2012/09/19 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
javascript制作的简单注册模块表单验证
2015/04/13 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
2016/01/12 Javascript
Javascript中的迭代、归并方法详解
2016/06/14 Javascript
简单谈谈Javascript函数中的arguments
2017/02/09 Javascript
在javaScript中检测数据类型的几种方式小结
2017/03/04 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
Vue.js 利用v-for中的index值实现隔行变色
2018/08/01 Javascript
你可能不知道的CORS跨域资源共享
2019/03/13 Javascript
Vue 的双向绑定原理与用法揭秘
2020/05/06 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
给Python入门者的一些编程建议
2015/06/15 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
对Python实现简单的API接口实例讲解
2018/12/10 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
详解Python的三种可变参数
2019/05/08 Python
python 字符串追加实例
2019/07/20 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
Python各种扩展名区别点整理
2020/02/27 Python
python解释器安装教程的方法步骤
2020/07/02 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
HTML5实现自带进度条和滑块滑杆效果
2018/04/17 HTML / CSS
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
Tomcat中怎么使用log4j输出所有的log
2016/07/07 面试题
介绍一下木马病毒的种类
2015/07/26 面试题
篮球兴趣小组活动总结
2014/07/07 职场文书