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简单实现子网掩码转换的方法
Apr 13 Python
Python 40行代码实现人脸识别功能
Apr 02 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
Jul 11 Python
利用Python如何批量更新服务器文件
Jul 29 Python
python批量创建指定名称的文件夹
Mar 21 Python
Python Matplotlib 基于networkx画关系网络图
Jul 10 Python
Python在cmd上打印彩色文字实现过程详解
Aug 07 Python
wxPython+Matplotlib绘制折线图表
Nov 19 Python
爬虫代理池Python3WebSpider源代码测试过程解析
Dec 20 Python
简单了解django文件下载方式
Feb 10 Python
Python使用docx模块实现刷题功能代码
Feb 13 Python
python使用多线程+socket实现端口扫描
May 28 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
三国漫画《火凤燎原》宣布动画化PV放出 预计2020年播出
2020/03/08 国漫
PHP实现的简单日历类
2014/11/29 PHP
php5.4以下版本json不支持不转义内容中文的解决方法
2015/01/13 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
PHP检测链接是否存在的代码实例分享
2016/05/06 PHP
fromCharCode和charCodeAt 方法
2006/12/27 Javascript
JavaScript 对象模型 执行模型
2009/12/06 Javascript
在js(jquery)中获得文本框焦点和失去焦点的方法
2012/12/04 Javascript
html页面显示年月日时分秒和星期几的两种方式
2013/08/20 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
使用原生JS实现弹出层特效
2014/12/22 Javascript
提高jQuery性能优化的技巧
2015/08/03 Javascript
jQuery复合事件用法示例
2017/06/10 jQuery
Vue.js 点击按钮显示/隐藏内容的实例代码
2018/02/08 Javascript
layer弹出子iframe层父子页面传值的实现方法
2018/11/22 Javascript
Vue开发之watch监听数组、对象、变量操作分析
2019/04/25 Javascript
js使用cookie实现记住用户名功能示例
2019/06/13 Javascript
基于javascript实现贪吃蛇经典小游戏
2020/04/10 Javascript
extjs图形绘制之饼图实现方法分析
2020/03/06 Javascript
[48:48]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Dream TIME
2014/05/21 DOTA
python多线程抓取天涯帖子内容示例
2014/04/03 Python
理解Python中函数的参数
2015/04/27 Python
python实现带声音的摩斯码翻译实现方法
2015/05/20 Python
Python3.6简单操作Mysql数据库
2017/09/12 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
win10从零安装配置pytorch全过程图文详解
2020/05/08 Python
html2 canvas生成清晰的图片实现打印功能
2019/09/23 HTML / CSS
小学生秋游活动方案
2014/02/23 职场文书
挂牌仪式策划方案
2014/05/18 职场文书
招标承诺书
2014/08/30 职场文书
欠款纠纷起诉状
2015/05/19 职场文书
漫画《尖帽子的魔法工坊》宣布动画化
2022/04/06 日漫
古见同学有交流障碍症 第二季宣传CM公开播出
2022/04/11 日漫
python 镜像环境搭建总结
2022/09/23 Python