单链表结构:

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

单链表时间复杂度:

创建空表:O(1)

删除表:O(1)

判断空:O(1)

加入:

首端加入:O(1)

尾端加入:O(n)

定位加入:O(n)

删除:

首端删除:O(1)

尾端删除:O(n)

定位删除:O(n)

其他删除:O(n)

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

  

单链表 实现:

 class LinkedListUnderflow(ValueError): #自定义链表为空异常类
pass class Lnode(object):
def __init__(self,ele,next=None):
self.ele = ele
self.next = next class Dlist(object):
def __init__(self):
self.head = None def is_emtpy(self): #链表是否为空
if self.head == None: return True def last_append(self,ele): #尾插入
p = Lnode(ele=ele) if self.is_emtpy():
self.head = p
return last_p = self.head
while last_p.next: #找到尾部后插入
last_p = last_p.next
last_p.next = p def head_append(self,ele): #头插入
p = Lnode(ele=ele) if self.is_emtpy():
self.head = p
return p.next = self.head
self.head = p def head_pop(self):
if self.is_emtpy():
raise LinkedListUnderflow("链表为空") if self.head.next == None: #只有一个节点
self.head = None
return self.head = self.head.next def last_pop(self):
if self.is_emtpy():
raise LinkedListUnderflow("链表为空") if self.head.next == None: # 只有一个节点
self.head = None
return p = self.head
while p.next.next: #找到倒数第二个节点
p = p.next
p.next = None def print_all(self): #输出所有元素
if self.is_emtpy():
print("链表为空")
return last_p = self.head
while last_p:
print(last_p.ele)
last_p = last_p.next

单链表

循环单链表:

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

循环单链表实现

 class LooDlist(object):
def __init__(self):
self._real = None def is_emtpy(self):
return self._real is None def head_append(self,ele):
p = Lnode(ele=ele) if self.is_emtpy():
self._real = p
p.next = self._real #建立一个列表循环
return p.next = self._real.next #在首部添加新节点
self._real.next = p def last_append(self,ele):
self.head_append(ele)
self._real = self._real.next #将尾部指针向后移一位 def pop(self): #前端弹出
if self.is_emtpy():
raise LinkedListUnderflow("链表为空") if self._real.next == self._real: #只有一个节点
print(self._real.ele)
self._real = None
return value = self._real.next.ele
self._real.next = self._real.next.next #弹出前端节点,尾部指针指向弹出节点的next对象
return value def print_all(self):
if self.is_emtpy():
return p = self._real.next
while True:
print(p.ele)
if p is self._real:
break
p = p.next

双向链表:

双向链表实现:

#双向链表

class Delement(object):
def __init__(self,ele,next=None,pre=None):
self.ele = ele
self.next = next
self.pre = pre class Bllist(object):
def __init__(self):
self.head = None
self.real = None def Empty(self): #清空链表
self.head = None
self.real = None def head_append(self,ele): #前端增加
p = Delement(ele=ele,next=self.head) if not self.head: #链表为空
self.head = p
self.real = p
return self.head.pre = p
self.head = p def last_append(self,ele): #尾端增加
p = Delement(ele=ele,pre=self.real) if not self.real:
self.head = p
self.real = p
return self.real.next = p
self.real = p def head_pop(self): #前端删除
if not self.head:
raise ValueError("列表为空") value = self.head.ele
if self.head == self.real: #只有一个元素清空
self.Empty()
return value self.head = self.head.next
self.head.pre = None
return value def last_pop(self):
if not self.real:
raise ValueError("列表为空") value = self.real.ele
if self.head == self.real:
self.Empty()
return value self.real = self.real.pre
self.real.next = None
return value def printall(self): #输出所有元素值
p = self.head
while p != self.real:
print(p.ele)
p = p.next if p: #链表是否为空
print(p.ele)

链表反转

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


class Lnode(object):
def __init__(self, ele, next=None):
self.next = next
self.ele = ele class Dlist(object):
def __init__(self):
self.head = None def head_append(self, ele): # 头插入
p = Lnode(ele=ele)
if not self.head:
self.head = p
return
p.next = self.head
self.head = p def reverse(self):
q = None #新链表 while True: #从原链表中拿到一个元素放入新链表
p = self.head #剔除原链表最上方的元素
self.head = self.head.next if p == None: #原链表没元素了
break p.next = q #将剔除元素放入新的链表
q = p self.head = q #将反转的链表给原链表 def printall(self):
p = self.head
while p != None:
print(p.ele)
p = p.next a = Dlist()
for i in range(10):
a.head_append(i) a.reverse()
a.printall()
 

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. 【python数据分析实战】电影票房数据分析(二)数据可视化

    目录 图1 每年的月票房走势图 图2 年票房总值.上映影片总数及观影人次 图3 单片总票房及日均票房 图4 单片票房及上映月份关系图 在上一部分<[python数据分析实战]电影票房数据分析(一 ...

  2. 别再让你的微服务裸奔了,基于 Spring Session & Spring Security 微服务权限控制

    微服务架构 网关:路由用户请求到指定服务,转发前端 Cookie 中包含的 Session 信息: 用户服务:用户登录认证(Authentication),用户授权(Authority),用户管理(R ...

  3. Kafka 权威指南阅读笔记(第三章,第四章)

    Kafka 第三章,第四章阅读笔记 Kafka 发送消息有三种方式:不关心结果的,同步方式,异步方式. Kafka 的异常主要有两类:一种是可重试异常,一种是无需重试异常. 生产者的配置: acks ...

  4. InitializingBean,spring 初始化bean

    springframework的提供接口,InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的 ...

  5. Java基础(41)AbstractList类

    AbstractList类的子类有AbstractSequentialList(其子类是LinkedList)和ArrayList 1.LinkedList 定义 public class Linke ...

  6. Java基础(二十九)Java IO(6)对象序列化(Object Serialization)

    参考之前整理过的Java序列化与反序列化:https://www.cnblogs.com/BigJunOba/p/9127414.html 使用对象输入输出流可以实现对象序列化与反序列化,可以直接存取 ...

  7. Pythonyu语法入门01

    引子 ​ 基于上一篇所学,有了计算机硬件,再在硬件之上安装好操作系统,我们就有了一个应用程序的运行平台,我们接下来的任务就是学习如何使用某款编程语言来开发应用程序. ​ 本篇的主题是先带大家了解下编程 ...

  8. forEach,map,every,some,filter简单用法实例

    平时简单总结:不足之处还望见谅: 实例: 11.1 forEach:只能进行取值操作,不能进行修改 arr.forEach(function(element,index,arr){});//注意参数: ...

  9. VB.NET 与 SAP RFC连接问题点

    与SAP RFC连接,电脑上必须要安装SAP软件,否则会报错ActiveX 输入工单号,无法带出SAP内接口RFC信息. 确认原因为:RFC接口需求的工单参数需要在前面加两位00,例如:1000541 ...

  10. Mysql数据一般问题

    数据插入中文全部变为???问题: 1.停止Mysql服务: 2.修改C:\Program Files (x86)\MySQL\MySQL Server 5.5\My.ini default-chara ...