python双向链表和单链表类似,只不过是增加了一个指向前面一个元素的指针,下面的代码实例了python双向链表的方法

示意图:

python双向链表实现代码

# -*- coding: utf-8 -*-
class Node(object):
def __init__(self, val, p=0):
self.data = val
self.next = p
self.prev = p class LinkList(object):
def __init__(self):
self.head = 0 def __getitem__(self, key): if self.is_empty():
print('linklist is empty.')
return elif key < 0 or key > self.getlength():
print('the given key is error')
return else:
return self.getitem(key) def __setitem__(self, key, value): if self.is_empty():
print('linklist is empty.')
return elif key < 0 or key > self.getlength():
print('the given key is error')
return else:
self.delete(key)
return self.insert(key) def initlist(self, data): self.head = Node(data[0]) p = self.head for i in data[1:]:
node = Node(i)
p.next = node
node.prev = p
p = p.next def getlength(self): p = self.head
length = 0
while p != 0:
length += 1
p = p.next return length def is_empty(self): if self.getlength() == 0:
return True
else:
return False def clear(self): self.head = 0 def append(self, item): q = Node(item)
if self.head == 0:
self.head = q
else:
p = self.head
while p.next != 0:
p = p.next
p.next = q
q.prev = p def getitem(self, index): if self.is_empty():
print('Linklist is empty.')
return
j = 0
p = self.head while p.next != 0 and j < index:
p = p.next
j += 1 if j == index:
return p.data
else:
print('target is not exist!') def insert(self, index, item): if self.is_empty() or index < 0 or index > self.getlength():
print('Linklist is empty.')
return if index == 0:
q = Node(item, self.head) self.head = q p = self.head
post = self.head
j = 0
while p.next != 0 and j < index:
post = p
p = p.next
j += 1 if index == j:
q = Node(item, p)
post.next = q
q.prev = post
q.next = p
p.prev = q def delete(self, index): if self.is_empty() or index < 0 or index > self.getlength():
print('Linklist is empty.')
return if index == 0:
q = Node(item, self.head) self.head = q p = self.head
post = self.head
j = 0
while p.next != 0 and j < index:
post = p
p = p.next
j += 1 if index == j:
post.next = p.next
p.next.prev = post def index(self, value): if self.is_empty():
print('Linklist is empty.')
return p = self.head
i = 0
while p.next != 0 and not p.data == value:
p = p.next
i += 1 if p.data == value:
return i
else:
return -1 l = LinkList()
l.initlist([1, 2, 3, 4, 5])
print(l.getitem(4))
l.append(6)
print(l.getitem(5))
l.insert(4, 40)
print(l.getitem(3))
print(l.getitem(4))
print(l.getitem(5))
l.delete(5)
print(l.getitem(5))
l.index(5)

输出:

5
6
4
40
5
6

python双向链表的实现的更多相关文章

  1. Python 双向链表

    操作 is_empty() 链表是否为空 length() 链表长度 travel() 遍历链表 add(item) 链表头部添加 append(item) 链表尾部添加 insert(pos, it ...

  2. python双向链表的疑问(Question)

    Table of Contents 1. 问题 问题 在看 collections.OrderedDict 的源码时,对于它如何构造有序的结构这一部分不是很理解,代码如下: class Ordered ...

  3. Python 双向链表 快速排序

    1.创建链表: from random import randint class DLinkedNode(object): def __init__(self, data=None, pre=None ...

  4. python 数据结构之双向链表的实现

    和单链表类似,只不过是增加了一个指向前面一个元素的指针而已. 示意图: python 实现代码: #!/usr/bin/python # -*- coding: utf-8 -*- class Nod ...

  5. Python链表的实现与使用(单向链表与双向链表)

    参考[易百教程]用Python实现链表及其功能 """ python链表的基本操作:节点.链表.增删改查 """ import sys cl ...

  6. (转)Python 实现双向链表(图解)

    原文:https://blog.csdn.net/qq490691606/article/details/49948263 Python 实现双向链表(图解)双向链表双向链表也叫双链表,是链表的一种, ...

  7. Python 实现双向链表(图解)

    原文:https://blog.csdn.net/qq490691606/article/details/49948263 git 路径 https://github.com/wangpanjun/d ...

  8. 用Python写单向链表和双向链表

    链表是一种数据结构,链表在循环遍历的时候效率不高,但是在插入和删除时优势比较大. 链表由一个个节点组成. 单向链表的节点分为两个部分:存储的对象和对下一个节点的引用.注意是指向下一个节点. 而双向链表 ...

  9. python算法与数据结构-双向链表(40)

    一.双向链表的介绍 一种更复杂的链表是“双向链表”或“双面链表”.每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值:而另一个指向下一个节点,当此节点为最后一个节点时,指向空值. ...

随机推荐

  1. 关于js重名方法的先后调用问题

    当js中方法重名时,最后引入的js会覆盖前面的引入的js(就是说会调用最后引入的js中的方法)详情参照(main.js与white.js 的a())但是,当最后一个js中存在语法上的错误时(也可以是本 ...

  2. 【pytest】(四) pytest的一些其他的运行用法

    1. 可以设置当失败N个后停止测试 pytest -x 是当第一个失败产生后,停止 pytest --maxfail=2, 这里就是当失败2个用例后,停止测试 2.pytest 在命令行模式下支持多种 ...

  3. [源码解析] Flink的Slot究竟是什么?(2)

    [源码解析] Flink 的slot究竟是什么?(2) 目录 [源码解析] Flink 的slot究竟是什么?(2) 0x00 摘要 0x01 前文回顾 0x02 注册/更新Slot 2.1 Task ...

  4. HDU-4417-Super Mario(线段树+离线处理)

    Mario is world-famous plumber. His “burly” figure and amazing jumping ability reminded in our memory ...

  5. Construct a Matrix (矩阵快速幂+构造)

    There is a set of matrixes that are constructed subject to the following constraints: 1. The matrix ...

  6. 深入了解Netty【六】Netty工作原理

    引言 前面学习了NIO与零拷贝.IO多路复用模型.Reactor主从模型. 服务器基于IO模型管理连接,获取输入数据,又基于线程模型,处理请求. 下面来学习Netty的具体应用. 1.Netty线程模 ...

  7. 09_Python语法示例(数据类型)

    1.买苹果,计算金额并保留两位小数 price = int(input("苹果的单价: ")) weight = float(input("苹果的重量: ")) ...

  8. 干货:不同场景容器内获取客户端源IP的方法

    摘要:客户端和容器服务器之间可能存在多种不同形式的代理服务器,那容器中如何获取到客户端真实的源ip呢? k8s已经成为当今容器化的标准,人们在享受容器带来的高效与便利的同时,也遇到一些烦恼:客户端和容 ...

  9. Kubernetes 服务部署最佳实践(二) ——如何提高服务可用性

    引言 上一篇文章我们围绕如何合理利用资源的主题做了一些最佳实践的分享,这一次我们就如何提高服务可用性的主题来展开探讨. 怎样提高我们部署服务的可用性呢?K8S 设计本身就考虑到了各种故障的可能性,并提 ...

  10. linux系统的默认用户

    1.可以通过cat /etc/passwd |cut -f1 -d:   可以提取/etc/passwd文件的第一个字段 2.也可以通过vipw进入vi编辑器来查看该文件每一行的第一个字段 linux ...