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 相关文章推荐
Django数据库表反向生成实例解析
Feb 06 Python
详解python中的index函数用法
Aug 06 Python
Django ORM多对多查询方法(自定义第三张表&amp;ManyToManyField)
Aug 09 Python
Python3使用PySynth制作音乐的方法
Sep 09 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 Python
python集成开发环境配置(pycharm)
Feb 14 Python
python3连接MySQL8.0的两种方式
Feb 17 Python
python+OpenCV实现图像拼接
Mar 05 Python
keras实现theano和tensorflow训练的模型相互转换
Jun 19 Python
Python+OpenCV图像处理——实现直线检测
Oct 23 Python
详解python中的异常捕获
Dec 15 Python
深度学习tensorflow基础mnist
Apr 14 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线性表顺序存储实现代码(增删查改)
2012/02/16 PHP
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
2013/06/24 PHP
PHP开发框架Laravel数据库操作方法总结
2014/09/03 PHP
php中get_cfg_var()和ini_get()的用法及区别
2015/03/04 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
2015/11/09 PHP
ie8本地图片上传预览示例代码
2014/01/12 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
2014/11/17 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
JavaScript function函数种类详解
2016/02/22 Javascript
利用css+原生js制作简单的钟表
2020/04/07 Javascript
js原生实现FastClick事件的实例
2016/11/20 Javascript
javascript ES6中箭头函数注意细节小结
2017/02/17 Javascript
原生JavaScrpit中异步请求Ajax实现方法
2017/11/03 Javascript
详解解决使用axios发送json后台接收不到的问题
2018/06/27 Javascript
JavaScript事件冒泡与事件捕获实例分析
2018/08/01 Javascript
jQuery 实现批量提交表格多行数据的方法
2018/08/09 jQuery
详解javascript对数组和json数组的操作
2019/04/15 Javascript
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
Python字典简介以及用法详解
2016/11/15 Python
python django使用haystack:全文检索的框架(实例讲解)
2017/09/27 Python
浅谈flask源码之请求过程
2018/07/26 Python
使用CodeMirror实现Python3在线编辑器的示例代码
2019/01/14 Python
python实现一行输入多个值和一行输出多个值的例子
2019/07/16 Python
python3+django2开发一个简单的人员管理系统过程详解
2019/07/23 Python
python 通过exifread读取照片信息
2020/12/24 Python
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
微软加拿大官方网站:Microsoft Canada
2019/04/28 全球购物
爸爸的花儿落了教学反思
2014/02/20 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
六五普法宣传标语
2014/10/06 职场文书
初三语文教学计划
2015/01/22 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书
《正面管教》读后有感:和善而坚定的旅程
2019/12/19 职场文书
《宝可梦》动画制作25周年到来 官方发布特别纪念视频
2022/04/01 日漫
springcloud整合seata
2022/05/20 Java/Android