单链表结构:

链表是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。对于python来说指针就是指向下一个对象。

单链表时间复杂度:

创建空表:O(1)

删除表:O(1)

判断空:O(1)

加入:

首端加入:O(1)

尾端加入:O(n)

定位加入:O(n)

删除:

首端删除:O(1)

尾端删除:O(n)

定位删除:O(n)

其他删除:O(n)

扫描定位遍历都需要价差一批表节点,其时间复杂度收到节点数约束。

  

单链表 实现:

  1. class LinkedListUnderflow(ValueError): #自定义链表为空异常类
  2. pass
  3.  
  4. class Lnode(object):
  5. def __init__(self,ele,next=None):
  6. self.ele = ele
  7. self.next = next
  8.  
  9. class Dlist(object):
  10. def __init__(self):
  11. self.head = None
  12.  
  13. def is_emtpy(self): #链表是否为空
  14. if self.head == None:
  15.  
  16. return True
  17.  
  18. def last_append(self,ele): #尾插入
  19. p = Lnode(ele=ele)
  20.  
  21. if self.is_emtpy():
  22. self.head = p
  23. return
  24.  
  25. last_p = self.head
  26. while last_p.next: #找到尾部后插入
  27. last_p = last_p.next
  28. last_p.next = p
  29.  
  30. def head_append(self,ele): #头插入
  31. p = Lnode(ele=ele)
  32.  
  33. if self.is_emtpy():
  34. self.head = p
  35. return
  36.  
  37. p.next = self.head
  38. self.head = p
  39.  
  40. def head_pop(self):
  41. if self.is_emtpy():
  42. raise LinkedListUnderflow("链表为空")
  43.  
  44. if self.head.next == None: #只有一个节点
  45. self.head = None
  46. return
  47.  
  48. self.head = self.head.next
  49.  
  50. def last_pop(self):
  51. if self.is_emtpy():
  52. raise LinkedListUnderflow("链表为空")
  53.  
  54. if self.head.next == None: # 只有一个节点
  55. self.head = None
  56. return
  57.  
  58. p = self.head
  59. while p.next.next: #找到倒数第二个节点
  60. p = p.next
  61. p.next = None
  62.  
  63. def print_all(self): #输出所有元素
  64. if self.is_emtpy():
  65. print("链表为空")
  66. return
  67.  
  68. last_p = self.head
  69. while last_p:
  70. print(last_p.ele)
  71. last_p = last_p.next

单链表

循环单链表:

python中的循环单链表,实际就是尾部(tail)节点的指针指向head对象。所以循环单链表实现中只需要实现self.tail而头部即为self.tail.next,以此形成循环进行节点操作。

循环单链表实现

  1. class LooDlist(object):
  2. def __init__(self):
  3. self._real = None
  4.  
  5. def is_emtpy(self):
  6. return self._real is None
  7.  
  8. def head_append(self,ele):
  9. p = Lnode(ele=ele)
  10.  
  11. if self.is_emtpy():
  12. self._real = p
  13. p.next = self._real #建立一个列表循环
  14. return
  15.  
  16. p.next = self._real.next #在首部添加新节点
  17. self._real.next = p
  18.  
  19. def last_append(self,ele):
  20. self.head_append(ele)
  21. self._real = self._real.next #将尾部指针向后移一位
  22.  
  23. def pop(self): #前端弹出
  24. if self.is_emtpy():
  25. raise LinkedListUnderflow("链表为空")
  26.  
  27. if self._real.next == self._real: #只有一个节点
  28. print(self._real.ele)
  29. self._real = None
  30. return
  31.  
  32. value = self._real.next.ele
  33. self._real.next = self._real.next.next #弹出前端节点,尾部指针指向弹出节点的next对象
  34. return value
  35.  
  36. def print_all(self):
  37. if self.is_emtpy():
  38. return
  39.  
  40. p = self._real.next
  41. while True:
  42. print(p.ele)
  43. if p is self._real:
  44. break
  45. p = p.next

双向链表:

双向链表实现:

  1. #双向链表
  2.  
  3. class Delement(object):
  4. def __init__(self,ele,next=None,pre=None):
  5. self.ele = ele
  6. self.next = next
  7. self.pre = pre
  8.  
  9. class Bllist(object):
  10. def __init__(self):
  11. self.head = None
  12. self.real = None
  13.  
  14. def Empty(self): #清空链表
  15. self.head = None
  16. self.real = None
  17.  
  18. def head_append(self,ele): #前端增加
  19. p = Delement(ele=ele,next=self.head)
  20.  
  21. if not self.head: #链表为空
  22. self.head = p
  23. self.real = p
  24. return
  25.  
  26. self.head.pre = p
  27. self.head = p
  28.  
  29. def last_append(self,ele): #尾端增加
  30. p = Delement(ele=ele,pre=self.real)
  31.  
  32. if not self.real:
  33. self.head = p
  34. self.real = p
  35. return
  36.  
  37. self.real.next = p
  38. self.real = p
  39.  
  40. def head_pop(self): #前端删除
  41. if not self.head:
  42. raise ValueError("列表为空")
  43.  
  44. value = self.head.ele
  45. if self.head == self.real: #只有一个元素清空
  46. self.Empty()
  47. return value
  48.  
  49. self.head = self.head.next
  50. self.head.pre = None
  51. return value
  52.  
  53. def last_pop(self):
  54. if not self.real:
  55. raise ValueError("列表为空")
  56.  
  57. value = self.real.ele
  58. if self.head == self.real:
  59. self.Empty()
  60. return value
  61.  
  62. self.real = self.real.pre
  63. self.real.next = None
  64. return value
  65.  
  66. def printall(self): #输出所有元素值
  67. p = self.head
  68. while p != self.real:
  69. print(p.ele)
  70. p = p.next
  71.  
  72. if p: #链表是否为空
  73. print(p.ele)

链表反转

原理:原链表相当于一摞书,将这摞书最上面的一本拿下来 放在一个位置B, 再拿一本再放在位置B的最上面,重复这个过程。

  1.  
  1. class Lnode(object):
    def __init__(self, ele, next=None):
    self.next = next
    self.ele = ele
  2.  
  3. class Dlist(object):
    def __init__(self):
    self.head = None
  4.  
  5. def head_append(self, ele): # 头插入
    p = Lnode(ele=ele)
    if not self.head:
    self.head = p
    return
    p.next = self.head
    self.head = p
  6.  
  7. def reverse(self):
    q = None #新链表
  8.  
  9. while True: #从原链表中拿到一个元素放入新链表
    p = self.head #剔除原链表最上方的元素
    self.head = self.head.next
  10.  
  11. if p == None: #原链表没元素了
    break
  12.  
  13. p.next = q #将剔除元素放入新的链表
    q = p
  14.  
  15. self.head = q #将反转的链表给原链表
  16.  
  17. def printall(self):
    p = self.head
    while p != None:
    print(p.ele)
    p = p.next
  18.  
  19. a = Dlist()
    for i in range(10):
    a.head_append(i)
  20.  
  21. a.reverse()
    a.printall()
  1.  

python描述:链表的更多相关文章

  1. 杂项之python描述符协议

    杂项之python描述符协议 本节内容 由来 描述符协议概念 类的静态方法及类方法实现原理 类作为装饰器使用 1. 由来 闲来无事去看了看django中的内置分页方法,发现里面用到了类作为装饰器来使用 ...

  2. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解

     1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...

  3. 【转载】Python 描述符简介

    来源:Alex Starostin 链接:www.ibm.com/developerworks/cn/opensource/os-pythondescriptors/ 关于Python@修饰符的文章可 ...

  4. python描述符descriptor(一)

    Python 描述符是一种创建托管属性的方法.每当一个属性被查询时,一个动作就会发生.这个动作默认是get,set或者delete.不过,有时候某个应用可能会有 更多的需求,需要你设计一些更复杂的动作 ...

  5. python描述符 descriptor

    descriptor 在python中,如果一个新式类定义了__get__, __set__, __delete__方法中的一个或者多个,那么称之为descriptor.descriptor通常用来改 ...

  6. Python描述符的使用

    Python描述符的使用 前言 作为一位python的使用者,你可能使用python有一段时间了,但是对于python中的描述符却未必使用过,接下来是对描述符使用的介绍 场景介绍 为了引入描述符的使用 ...

  7. Python描述符 (descriptor) 详解

    1.什么是描述符? python描述符是一个“绑定行为”的对象属性,在描述符协议中,它可以通过方法重写属性的访问.这些方法有 __get__(), __set__(), 和__delete__().如 ...

  8. Python描述器引导(转)

    原文:http://pyzh.readthedocs.io/en/latest/Descriptor-HOW-TO-Guide.html 1. Python描述器引导(翻译) 作者: Raymond ...

  9. LeetCode初级算法的Python实现--链表

    LeetCode初级算法的Python实现--链表 之前没有接触过Python编写的链表,所以这里记录一下思路.这里前面的代码是和leetcode中的一样,因为做题需要调用,所以下面会给出. 首先定义 ...

  10. 算法之python创建链表实现cache

    算法之python创建链表实现cache 本节内容 问题由来 解决思路 实现代码 总结 1. 问题由来 问题起因于朋友的一次面试题,面试公司直接给出两道题,要求四十八小时之内做出来,语言不限,做出来之 ...

随机推荐

  1. LeetCode初级算法--设计问题01:Shuffle an Array (打乱数组)

    LeetCode初级算法--设计问题01:Shuffle an Array (打乱数组) 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:h ...

  2. 使用 statcounter 统计 Hexo 博客访问量

    介绍 statcounter是一个提供网站访问统计服务的网站: StatCounter is a simple but powerful real-time web analytics service ...

  3. Spring(三)面向切面编程(AOP)

    在直系学长曾经的指导下,参考了直系学长的博客(https://www.cnblogs.com/WellHold/p/6655769.html)学习Spring的另一个核心概念--面向切片编程,即AOP ...

  4. List<model>需要根据特定字段求差集的实现

    list对象不能直接使用Except等封装好的函数,因为内存地址不一样(还有一些数虽然主数据一致但是update/create信息也不一致,对,我碰到的需求就是这么难受 TOT) 这时候我们的需求很多 ...

  5. 用Python编写简单的发红包程序和计算器原理

    用Python编写简单的发红包程序: 第一种解法:数轴方法解决 import random def red_packet(money,num): money = money * 100 #将钱数转换成 ...

  6. redis is configured to save RDB snapshots

    Redis被配置为保存数据库快照,但它目前不能持久化到硬盘.用来修改集合数据的命令不能用 原因: 强制关闭Redis 快照导致不能持久化. 解决方法: 运行 config set stop-write ...

  7. phpstudy 升级mysql到mysql5.7

    前言 今天在工作发现一个错误,在往本地导数据表的时候老是报错: ? 1 [Err] 1294 - Invalid ON UPDATE clause for '字段名' column 报错的数据表字段: ...

  8. 20190730_图像混合_opencv_python

    今天学习了 图像的混合 教程上的代码很简单,但是绝对运行不出来 教程名称:OpenCV-Python 中文教程 #图像融合 import cv2 import numpy as np import m ...

  9. c# 保留两位小数点

    保留两位小数点 由于简单的原因大家直接看代码块. using System; namespace HelloWorld { class Program { static void Main(strin ...

  10. K近邻(k-Nearest Neighbor,KNN)算法,一种基于实例的学习方法

    1. 基于实例的学习算法 0x1:数据挖掘的一些相关知识脉络 本文是一篇介绍K近邻数据挖掘算法的文章,而所谓数据挖掘,就是讨论如何在数据中寻找模式的一门学科. 其实人类的科学技术发展的历史,就一直伴随 ...