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(一)Python环境安装
Aug 20 Python
Python中使用第三方库xlutils来追加写入Excel文件示例
Apr 05 Python
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
Apr 08 Python
用Python的Django框架来制作一个RSS阅读器
Jul 22 Python
python实现web方式logview的方法
Aug 10 Python
简单谈谈python的反射机制
Jun 28 Python
python3.4实现邮件发送功能
May 28 Python
python获取服务器响应cookie的实例
Dec 28 Python
使用python写一个自动浏览文章的脚本实例
Dec 05 Python
Python 添加文件注释和函数注释操作
Aug 09 Python
详解Python流程控制语句
Oct 28 Python
Python如何让字典保持有序排列
Apr 29 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关于array_multisort多维数组排序的使用说明
2011/01/04 PHP
php管理nginx虚拟主机shell脚本实例
2014/11/19 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
asp.net HttpHandler实现图片防盗链
2009/11/09 Javascript
ExtJS GridPanel 根据条件改变字体颜色
2010/03/08 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
jQuery实现文件上传进度条特效
2015/08/12 Javascript
Jquery实时监听input value的实例
2017/01/26 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
微信小程序select下拉框实现源码
2019/11/08 Javascript
微信小程序 获取手机号 JavaScript解密示例代码详解
2020/05/14 Javascript
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
Python获取远程文件大小的函数代码分享
2014/05/13 Python
python实现可将字符转换成大写的tcp服务器实例
2015/04/29 Python
Python的requests网络编程包使用教程
2016/07/11 Python
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
Python安装模块的常见问题及解决方法
2018/02/05 Python
浅谈python3发送post请求参数为空的情况
2018/12/28 Python
Python实现的删除重复文件或图片功能示例【去重】
2019/04/23 Python
Tensorflow不支持AVX2指令集的解决方法
2020/02/03 Python
python dumps和loads区别详解
2020/02/04 Python
使用Pycharm分段执行代码
2020/04/15 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
2020/04/16 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
python利用os模块编写文件复制功能——copy()函数用法
2020/07/13 Python
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
小学生打架检讨书
2014/01/26 职场文书
写给女朋友的检讨书
2014/01/28 职场文书
药学专业学生的自我评价分享
2014/02/06 职场文书
个人剖析材料及整改措施
2014/10/07 职场文书
给女朋友道歉的话大全
2015/01/20 职场文书
Python中Permission denied的解决方案
2021/04/02 Python