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 相关文章推荐
linux系统使用python监测系统负载脚本分享
Jan 15 Python
Python中实现对list做减法操作介绍
Jan 09 Python
python中的随机函数小结
Jan 27 Python
替换python字典中的key值方法
Jul 06 Python
python2.7 安装pip的方法步骤(管用)
May 05 Python
Python常用模块之requests模块用法分析
May 15 Python
详解python中的time和datetime的常用方法
Jul 08 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
Jan 06 Python
tensorflow estimator 使用hook实现finetune方式
Jan 21 Python
python模式 工厂模式原理及实例详解
Feb 11 Python
keras slice layer 层实现方式
Jun 11 Python
Python中random模块常用方法的使用教程
Oct 04 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
法国:浪漫之都的咖啡文化
2021/03/03 咖啡文化
php stream_get_meta_data返回值
2013/09/29 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
2019/09/30 PHP
js 实现复制到粘贴板的功能代码
2010/05/13 Javascript
解决Extjs4中form表单提交后无法进入success函数问题
2013/11/26 Javascript
Javascript的&amp;&amp;和||的另类用法
2014/07/23 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
微信小程序 rich-text的使用方法
2017/08/04 Javascript
JavaScript变量类型以及变量作用域详解
2017/08/14 Javascript
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
2019/04/30 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
Element Card 卡片的具体使用
2020/07/26 Javascript
[36:41]完美世界DOTA2联赛循环赛FTD vs Magma第一场 10月30日
2020/10/31 DOTA
[52:39]完美世界DOTA2联赛PWL S3 CPG vs Forest 第一场 12.16
2020/12/17 DOTA
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
transform python环境快速配置方法
2018/09/27 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
python中for循环把字符串或者字典添加到列表的方法
2019/07/20 Python
完美解决keras保存好的model不能成功加载问题
2020/06/11 Python
python集合能干吗
2020/07/19 Python
python简单实现9宫格图片实例
2020/09/03 Python
德国EGOIST网店:销售畅销的设计师品牌
2017/04/18 全球购物
纽约海:Sea New York
2018/11/04 全球购物
Invicta手表官方商店:百年制表历史的瑞士腕表品牌
2019/09/26 全球购物
成教自我鉴定
2013/10/27 职场文书
一位农村小子的自荐信
2014/04/07 职场文书
党的群众路线教育实践活动学习计划
2014/11/03 职场文书
幼儿园新学期开学寄语
2015/05/27 职场文书
新郎父亲婚礼致辞
2015/07/27 职场文书
高三物理教学反思
2016/02/20 职场文书
导游词之天津盘山
2019/11/01 职场文书
Python列表的索引与切片
2022/04/07 Python
Nginx报错104:Connection reset by peer问题的解决及分析
2022/07/23 Servers