双向链表

双向链表又叫做双链表,每个节点有两个指针域和一个数据域。prev指针域指向前一个节点,next指针域指向下一个节点。注意,第一个节点的prev指针域指向空值,最后一个节点的next域也是指向空值。

双链表的主要操作跟单链表一样,具有如下操作

  1. is_empty() 链表是否为空

  2. length() 链表长度

  3. travel() 遍历整个链表

  4. add(item) 链表头部添加元素

  5. append(item) 链表尾部添加元素

  6. insert(pos, item) 指定位置添加元素

  7. remove(item) 删除节点

  8. search(item) 查找节点是否存在

python 实现:

#_*_coding:utf-8_*_

class Node(object):
def __init__(self, item):
self.item = item
self.prev = None
self.next = None class DoubleLinkList(object):
def __init__(self, node=None):
'''_head 作为类内部使用,对外不可见'''
self.__head = node def is_empty(self):
'''判断链表是否为空'''
return self.__head is None def length(self):
'''链表的长度'''
#特别要考虑当链表是空的情况
# cur游标,用来移动遍历节点
cur = self.__head
count = 0
while cur != None:
count += 1
cur = cur.next return count def travel(self):
'''遍历整个链表'''
cur = self.__head if cur == None:
print("empty linklist")
return
while cur != None:
print(cur.item, end=' ')
cur = cur.next
print('')
def add(self,item):
'''在链表头部添加元素,头插法'''
node = Node(item)
#指针指向的顺序可以变化
node.next = self.__head
self.__head = node
node.next.prev = node def append(self,item):
'''在链表尾部添加元素'''
node = Node(item)
cur = self.__head
#如果链表是空,则将头节点直接指向Node
if self.is_empty():
self.__head = node
else:
while cur.next != None:
cur = cur.next cur.next = node
node.prev = cur def insert(self,pos, item):
'''在链表指定的位置添加元素'''
"""
:param pos从0开始
"""
if pos <= 0:
self.add(item)
elif pos > (self.length() -1):
self.append(item)
else: cur = self.__head
count = 0
while count < pos:
count += 1
cur = cur.next
node = Node(item) node.next = cur
cur.prev.next = node
cur.prev = node
node.prev = cur.prev def remove(self, item):
'''删除某个元素的节点'''
cur = self.__head
while cur != None :
if cur.item == item:
#先判断此节点是否为头节点
if cur == self.__head:
self.__head = cur.next
if cur.next:
#要判断链表是否只有一个节点
cur.next.prev = None
else:
cur.prev.next = cur.next
if cur.next:
#如果删除的不是最后一个节点
cur.next.prev = cur.prev
break
else:
cur = cur.next def search(self, item):
''' 查找节点是否存在'''
cur = self.__head
while cur != None:
if cur.item == item:
return True
else:
cur = cur.next
return False if __name__ == '__main__':
ll = DoubleLinkList()
print(ll.is_empty())
print(ll.length())
ll.append(1)
ll.append(2)
ll.travel()
ll.add(3)
ll.travel()
ll.insert(2, 4)
ll.travel()
print(ll.search(3))
ll.travel()
ll.remove(2)
ll.travel()

运行结果:

True
0
1 2
3 1 2
3 1 4 2
True
3 1 4 2
3 1 4

2020年最新Python教程:

如果你处于想学Python或者正在学习Python,Python的教程不少了吧,但是是最新的吗?

说不定你学了可能是两年前人家就学过的内容,在这小编分享一波2020最新的Python教程。

以上这些教程小编已经为大家打包准备好了,希望对正在学习的你有所帮助!

获取方式,私信小编 “ 资料 ”,即可免费获取哦!

 

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

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

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

  2. Python开发【第三篇】:Python基本之文件操作

    Python基本之文本操作 一.初识文本的基本操作 在python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open ...

  3. 【Python数据分析】Python3操作Excel(二) 一些问题的解决与优化

    继上一篇[Python数据分析]Python3操作Excel-以豆瓣图书Top250为例 对豆瓣图书Top250进行爬取以后,鉴于还有一些问题没有解决,所以进行了进一步的交流讨论,这期间得到了一只尼玛 ...

  4. [python]用Python进行SQLite数据库操作

    用Python进行SQLite数据库操作 1.导入Python SQLITE数据库模块 Python2.5之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可~  ]: u ...

  5. python学习笔记:文件操作和集合(转)

    转自:http://www.nnzhp.cn/article/16/ 这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句 ...

  6. python os&shutil 文件操作

    python os&shutil 文件操作 # os 模块 os.sep 可以取代操作系统特定的路径分隔符.windows下为 '\\' os.name 字符串指示你正在使用的平台.比如对于W ...

  7. python对mysql数据库操作的三种不同方式

    首先要说一下,在这个暑期如果没有什么特殊情况,我打算用python尝试写一个考试系统,希望能在下学期的python课程实际使用,并且尽量在此之前把用到的相关技术都以分篇博客的方式分享出来,有想要交流的 ...

  8. Python实现浏览器自动化操作

    Python实现浏览器自动化操作 (2012-08-02 17:35:43) 转载▼     最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有不少介绍,例如使用pamie,但是只是 ...

  9. [转载]Python实现浏览器自动化操作

    原文地址:Python实现浏览器自动化操作作者:rayment   最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有不少介绍,例如使用pamie,但是只是支持IE,而且项目也较久没 ...

随机推荐

  1. ajax结合sweetalert弹出框删除数据

    思路:

  2. Effective python(五):内置模块

    1,考虑使用contextlib和with语句改写可复用的try/finally代码 with lock:print('lock is held')相当于try:print('lock is held ...

  3. [暴力] Educational Codeforces Round 71 (Rated for Div. 2) B. Square Filling (1207B)

    题目:http://codeforces.com/contest/1207/problem/B   B. Square Filling time limit per test 1 second mem ...

  4. 从阿里、腾讯的面试真题中总结了这11个Redis高频面试题

    前言 现在大家的工作生活基本已经是回归正轨了,最近也是迎来了跳槽面试季,有些人已经拿到了一两个offer了. 这段时间收集了阿里.腾讯.百度.京东.美团.字节跳动等公司的Java面试题,总结了Redi ...

  5. Go解算法07整数反转

    描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321  示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 ...

  6. 基于zookeeper实现分布式锁和基于redis实现分布所的区别

    1,实现方式不同 zookeeper实现分布式锁:通过创建一个临时节点,创建的成功节点的服务则抢占到分布式锁,可做业务逻辑.当业务逻辑完成,连接中断,节点消失,继续下一轮的锁的抢占. redis实现分 ...

  7. Ubuntu环境下如何设置文件(文件夹)权限

    查看文件(文件夹)权限 cd到需要查看的文件(文件夹)所在目录并执行: (base) duanyongchun@hc1217:~$ ls -l #查看当前文件夹下的所有文件(包括文件夹)的权限 如图: ...

  8. Ubuntu复制粘贴快捷键

    复制:[Ctrl+Insert] 粘贴:[Shitf+Insert]

  9. A song for a new begining 8月26日到10月11日 第一阶段

  10. U - Inviting Friends HDU - 3244( LIS 最长升序子序列——变形 )

    序列变换 Problem Description 我们有一个数列A1,A2-An,你现在要求修改数量最少的元素,使得这个数列严格递增.其中无论是修改前还是修改后,每个元素都必须是整数. 请输出最少需要 ...