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实现栈的方法
May 26 Python
Python实现的求解最小公倍数算法示例
May 03 Python
python opencv3实现人脸识别(windows)
May 25 Python
Python求解任意闭区间的所有素数
Jun 10 Python
python引入不同文件夹下的自定义模块方法
Oct 27 Python
python爬虫 Pyppeteer使用方法解析
Sep 28 Python
Python FTP文件定时自动下载实现过程解析
Nov 12 Python
解决TensorFlow模型恢复报错的问题
Feb 06 Python
Python Numpy,mask图像的生成详解
Feb 19 Python
python中format函数如何使用
Jun 22 Python
Python操作word文档插入图片和表格的实例演示
Oct 25 Python
Python 实现一个简单的web服务器
Jan 03 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如何透过ODBC来存取数据库
2006/10/09 PHP
php Ajax乱码
2008/04/09 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
php设计模式之观察者模式的应用详解
2013/05/21 PHP
Window下PHP三种运行方式图文详解
2013/06/11 PHP
Yii编程开发常见调用技巧集锦
2016/07/15 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
php中简单的对称加密算法实现
2017/01/05 PHP
深入浅析PHP的session反序列化漏洞问题
2017/06/15 PHP
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
IE下js调试工具Companion.JS
2010/10/15 Javascript
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
2015/03/12 Javascript
Node.js实现Excel转JSON
2015/04/24 Javascript
js操作css属性实现div层展开关闭效果的方法
2015/05/11 Javascript
JavaScript中字面量与函数的基本使用知识
2015/10/20 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
深入理解jquery的$.extend()、$.fn和$.fn.extend()
2017/07/08 jQuery
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
2018/04/27 Javascript
vue2.0学习之axios的封装与vuex介绍
2018/05/28 Javascript
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
vue单页缓存存在的问题及解决方案(小结)
2018/09/25 Javascript
JS module的导出和导入的实现代码
2019/02/25 Javascript
openlayers4.6.5实现距离量测和面积量测
2020/09/25 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
Django教程笔记之中间件middleware详解
2018/08/01 Python
Python3多线程基础知识点
2019/02/19 Python
让你Python到很爽的加速递归函数的装饰器
2019/05/26 Python
python同步windows和linux文件
2019/08/29 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
2019/10/18 Python
利用Python小工具实现3秒钟将视频转换为音频
2019/10/29 Python
怎么快速自学python
2020/06/22 Python
惠普香港官方商店:HP香港
2019/04/30 全球购物
立春观后感
2015/06/18 职场文书