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的Flask框架中生成SECRET_KEY密钥的方法
Jun 07 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
Jun 14 Python
Python用threading实现多线程详解
Feb 03 Python
Python编程实现二叉树及七种遍历方法详解
Jun 02 Python
numpy中的高维数组转置实例
Apr 17 Python
Python3.4 tkinter,PIL图片转换
Jun 21 Python
python实现zabbix发送短信脚本
Sep 17 Python
Python实现查找字符串数组最长公共前缀示例
Mar 27 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
May 29 Python
Python发展史及网络爬虫
Jun 19 Python
python中selenium操作下拉滚动条的几种方法汇总
Jul 14 Python
一些让Python代码简洁的实用技巧总结
Aug 23 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程序61条面向对象分析设计的经验小结
2008/11/12 PHP
PHP自动选择 连接本地还是远程数据库
2010/12/02 PHP
百度留言本js 大家可以参考下
2009/10/13 Javascript
js 复制或插入Html的实现方法小结
2010/05/19 Javascript
javascript字母大小写转换的4个函数详解
2014/05/09 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
2016/01/18 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
功能强大的Bootstrap组件(结合js)
2016/08/03 Javascript
jQuery使用each遍历循环的方法
2018/09/19 jQuery
代码分析vue中如何配置less
2018/09/28 Javascript
js删除对象/数组中null、undefined、空对象及空数组方法示例
2018/11/14 Javascript
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
python迭代器实例简析
2014/09/25 Python
python使用mailbox打印电子邮件的方法
2015/04/30 Python
python网络编程之数据传输UDP实例分析
2015/05/20 Python
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
用Django写天气预报查询网站
2018/10/21 Python
Python数学形态学实例分析
2019/09/06 Python
opencv设置采集视频分辨率方式
2019/12/10 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
印度在线内衣和时尚目的地:Zivame
2017/09/28 全球购物
一些Unix笔试题和面试题
2012/09/25 面试题
应届毕业生的自我鉴定
2013/11/13 职场文书
2014自主招生自荐信策略
2014/01/27 职场文书
幼儿园校车司机的岗位职责
2014/01/30 职场文书
诚信承诺书范文
2014/03/27 职场文书
精神文明单位申报材料
2014/05/02 职场文书
青春励志演讲稿范文
2014/08/25 职场文书
2014年医院党建工作总结
2014/12/20 职场文书
2015国际残疾人日活动总结
2015/03/24 职场文书
放假通知
2015/04/14 职场文书
赞助商致辞
2015/07/30 职场文书
简历中的自我评价怎么写呢?
2019/04/30 职场文书
Python 循环读取数据内存不足的解决方案
2021/05/25 Python