class Node(object):
"""结点""" def __init__(self, data):
self.data = data
self.pre = None
self.next = None class DoubleLinkList(object):
"""双链表""" def __init__(self, node=None):
self.__head = node def is_empty(self):
"""判断链表是否为空"""
return self.__head is None def length(self):
"""链表的长度"""
count = 0
cur = self.__head
while cur is not None:
count += 1
cur = cur.next
return count def travel(self):
"""遍历整个链表"""
cur = self.__head
while cur is not None:
print(cur.data, end="")
cur = cur.next
print() def add(self, item):
"""头插"""
node = Node(item)
# 空链表头插
if self.is_empty():
self.__head = node
# 非空链表头插
else:
node.next = self.__head
self.__head.pre = node
self.__head = node def append(self, item):
"""尾插"""
node = Node(item)
# 空链表尾插
if self.is_empty():
self.__head = node
# 非空链表尾插
else:
cur = self.__head
# 找到最后一个结点
while cur.next is not None:
cur = cur.next
cur.next = node
node.pre = cur def insert(self, pos, item):
"""指定位置插入"""
if pos <= 0:
self.add(item)
elif pos > self.length() - 1:
self.append(item)
else:
node = Node(item)
cur = self.__head
count = 0
# 找到指定位置的前一个结点
while count < pos - 1:
cur = cur.next
count += 1
node.next = cur.next
node.pre = cur
cur.next = node
node.next.pre = node def remove(self, item):
"""删除指定结点"""
cur = self.__head
while cur is not None:
# 找到要删除的结点
if cur.data == item:
# 如果要删除的结点是头结点
if cur == self.__head:
self.__head = cur.next
# 判断链表是否只有一个结点
if cur.next:
cur.next.pre = None
# 要删除的结点不是头结点
else:
cur.pre.next = cur.next
# 判断要删除的结点是否是尾结点
if cur.next:
cur.next.pre = cur.pre
return
else:
cur = cur.next def search(self, item):
"""查找结点是否存在"""
cur = self.__head
while cur is not None:
if cur.data == item:
return True
else:
cur = cur.next
return False if __name__ == '__main__':
sll = DoubleLinkList()
print(sll.is_empty())
print(sll.length())
sll.add(1)
sll.remove(1)
print(sll.is_empty())
print(sll.length())
sll.append(2)
sll.append(3)
sll.append(4)
sll.append(5)
sll.travel() # 2345
print(sll.length()) # 4
sll.add(99) # 99 2345
sll.travel()
print(sll.length()) # 5
print(sll.search(6)) # False
print(sll.search(4)) # True
sll.remove(5)
sll.travel() # 99 234

python---双链表的常用操作的更多相关文章

  1. 超详细!盘点Python中字符串的常用操作

    在Python中字符串的表达方式有四种 一对单引号 一对双引号 一对三个单引号 一对三个双引号 a = 'abc' b= "abc" c = '''abc''' d = " ...

  2. Python 基礎 - 字符串常用操作

    字符串常用操作 今天就介紹一下常用的字符串操作,都是以 Python3撰寫的 首字母變大寫 #!/usr/bin/env python3 # -*- coding:utf-8 -*- name = & ...

  3. python基础之列表常用操作及知识点小结

    列表(list) List(列表) 是 Python 中使用最频繁的数据类型.列表可以完成大多数集合类的数据结构实现.它支持字符,数字,字符串甚至可以包含列表(所谓嵌套).列表用[ ]标识,是pyth ...

  4. python数据类型:字典dict常用操作

    字典是Python语言中的映射类型,他是以{}括起来,里面的内容是以键值对的形式储存的: Key: 不可变(可哈希)的数据类型.并且键是唯一的,不重复的. Value:任意数据(int,str,boo ...

  5. Python列表类型及常用操作

    Python列表类型 1.用途: 存放多个值,可以根据索引存取值 2.定义方式: 在[ ]内用逗号分割开多个任意类型的值 l=['yven','law','lyf'] #l=list(['yven', ...

  6. 『无为则无心』Python序列 — 18、Python列表概念及常用操作API

    目录 1.列表的概念 (1)列表的定义 (2)列表的应用场景 (3)列表的定义格式 2.列表的常用操作 (1)列表的查找 1)通过下标查找 2)通过方法查找 3)判断是否存在 (2)列表的增加 @1. ...

  7. python 异常处理、文件常用操作

    异常处理 http://www.jb51.net/article/95033.htm 文件常用操作 http://www.jb51.net/article/92946.htm

  8. Python基础灬文件常用操作

    文件常用操作 文件内建函数和方法 open() :打开文件 read():输入 readline():输入一行 seek():文件内移动 write():输出 close():关闭文件 写文件writ ...

  9. python字符串、元组常用操作

    常用字符串操作函数: #Author:CGQ name="I \tam ChenGuoQiang" print(name.capitalize())#首字母大写,其他都小写 pri ...

随机推荐

  1. Net6 Configuration & Options 源码分析 Part1

    Net6 Configuration & Options 源码分析 Part1 在Net6中配置系统一共由两个部分组成Options 模型与配置系统.它们是两个完全独立的系统. 第一部分主要记 ...

  2. 用协程实现高并发I/O(async)

    对于并发要求比较法的I/O需求,可以用python的协程去处理. 重点: 1启动协程必须做一次函数调用 2协程激活只占用1kb内存,所以协程很多也问题不大 3这种效果需要使用关键字async和awai ...

  3. Linux指令_入门基础

    一.基础指令语法 1.ls指令: 用法1:#ls 含义:列出当前工作目录下的所有文件/文件夹的名称. 用法2:#ls 路径 含义:列出指定路径下的所有文件/文件夹的名称 用法3:#ls 选项 路径 含 ...

  4. ActiveMQ代码-01

    p2p模式 生产者 package com.activemq.activemqdemo.p2p; import org.apache.activemq.ActiveMQConnectionFactor ...

  5. web自动化之svg标签定位

    今天在定位元素的时候,发现页面有一个svg标签需要进行定位. 于是便使用常规的xpath定位方法试了一下,很明显结果是不行的,哈哈哈... 错误定位方法://div[@class="oper ...

  6. 磁盘管理--如何在VMware上给centos7增加一块磁盘

    一. 实验环境 VMware Workstaion + Centos7 二.实验步骤 1.关闭虚拟机,添加磁盘 2.添加硬件向导 硬件类型 你要安装哪类硬件? 点击完成观察到已经成功添加磁盘 3.开启 ...

  7. Ubuntu一键安装LAMP,LNMP

    参考: https://blog.csdn.net/xueyingqi/article/details/50674078 https://www.cnblogs.com/pengzheng/p/363 ...

  8. 一文读懂蓝绿发布、A/B 测试和金丝雀发布的优缺点

    作者 | 扬少 背景 目前,业界已经总结出了几种常见的服务发布策略来解决版本升级过程中带来的流量有损问题.本文首先会对这些普遍的发布策略进行简单的原理解析,最后结合阿里云的云原生网关对这些发布策略进行 ...

  9. uniapp小程序图片前端压缩上传

    目录 1,前言 2,实现代码 1,前言 这次项目中做了一个图片上传,要求是大于2MB的就压缩成2MB一下的再上传,我这边利用了uniapp的文件接口,使用canvas做了一个压缩上传的功能,目前已上线 ...

  10. Java有没有goto?

    goto 是Java中的保留字,在目前版本的Java中没有使用.(根据James Gosling(Java之父)编写的<The Java Programming Language>一书的附 ...