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 相关文章推荐
wxpython 学习笔记 第一天
Feb 09 Python
python里大整数相乘相关技巧指南
Sep 12 Python
python生成随机图形验证码详解
Nov 08 Python
python+pandas生成指定日期和重采样的方法
Apr 11 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
Apr 18 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
Apr 23 Python
pandas实现DataFrame显示最大行列,不省略显示实例
Dec 26 Python
彻底搞懂 python 中文乱码问题(深入分析)
Feb 28 Python
python实现一个猜拳游戏
Apr 05 Python
python excel多行合并的方法
Dec 09 Python
全面介绍python中很常用的单元测试框架unitest
Dec 14 Python
python实现简单聊天功能
Jul 07 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文件中bom的PHP代码
2012/03/13 PHP
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
js实现目录定位正文示例
2013/11/14 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
jQuery提示效果代码分享
2014/11/20 Javascript
JQuery选择器绑定事件及修改内容的方法
2015/01/23 Javascript
jquery实现顶部向右伸缩的导航区域代码
2015/09/02 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
vue中锚点的三种方法
2018/07/06 Javascript
layDate插件设置开始和结束时间
2018/11/15 Javascript
vue中多路由表头吸顶实现的几种布局方式
2019/04/12 Javascript
微信小程序版本自动更新的方法
2019/06/14 Javascript
vue+springboot图片上传和显示的示例代码
2020/02/14 Javascript
JQuery省市联动效果实现过程详解
2020/05/08 jQuery
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
python抓取百度首页的方法
2015/05/19 Python
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
python实现多进程代码示例
2018/10/31 Python
python_mask_array的用法
2020/02/18 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
2020/06/10 Python
详解CSS3开启硬件加速的使用和坑
2017/08/21 HTML / CSS
HTML5标签使用方法详解
2015/11/27 HTML / CSS
荷兰睡眠专家:Beter Bed
2020/11/23 全球购物
缓刑人员的思想汇报
2014/01/11 职场文书
开学典礼主持词
2014/03/19 职场文书
自行车广告词大全
2014/03/21 职场文书
副科竞争上岗演讲稿
2014/05/12 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
2015年七夕爱情寄语
2015/03/24 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书
MySQL 时间类型的选择
2021/06/05 MySQL
Opencv实现二维直方图的计算及绘制
2021/07/21 Python
Win11 Build 22000.51版本文件资源管理器“命令栏”和上下文菜单有什么新变化?
2021/11/21 数码科技