python---自己实现双向链表常用功能
这个和单向链表有几个功能是同样的代码。
但在add,insert,append,remove时,由于node拥有prev指针,
所以操作不一样。注意看注释。
# coding = utf-8
# 双向链表
class Node:
# 双向链表存在两个指标,一个向前,一个向后
def __init__(self, new_data):
self.data = new_data
self.prev = None
self.next = None
def get_data(self):
return self.data
def set_data(self, new_data):
self.data = new_data
def get_next(self):
return self.next
def set_next(self, new_next):
self.next = new_next
def get_prev(self):
return self.prev
def set_prev(self, new_prev):
self.prev = new_prev
class DoubleList:
def __init__(self):
self.head = None
# 作头插入时,需要要注意插入顺序,
# 总之。要注意不要丢失next和prev。
def add(self, item):
node = Node(item)
if not self.is_empty():
# 待插入节点的后继区指向原头节点
node.set_next(self.head)
# 原头节点的前驱区指向待插入节点
self.head.set_prev(node)
# 将head指向node
self.head = node
# 作尾插入时,需要先判断是否为空列表。因为空列表时,没有next。
# 为空列表时,尾插入和头插入代码相同。
# 当不为空时,需要循环到底,再作插入处理
def append(self, item):
node = Node(item)
if self.is_empty():
# 将head指向node
self.head = node
else:
# 移动到链表尾部
current = self.head
while current.get_next() is not None:
current = current.get_next()
# 将尾节点cur的next指向node
current.set_next(node)
# 将node的prev指向cur
node.set_prev(current)
# 指定位置插入节点
def insert(self, pos, item):
# 相当于头插入
if pos <= 0:
self.add(item)
# 相当于尾插入
elif pos >= self.size():
self.append(item)
else:
node = Node(item)
count = 0
current = self.head
# 先将游标指到要插入位置
while count < pos - 1:
count += 1
current = current.get_next()
# 将node的prev指向cur
node.set_prev(current)
# 将node的next指向cur的下一个节点
node.set_next(current.get_next())
# 将cur的下一个节点的prev指向node
current.get_next().set_prev(node)
# 将cur的next指向node
current.set_next(node)
# 删除指定节点数据
def remove(self, item):
# 删除时,不需要再使用一个prev变量了。因为双向链表本身有这个指针
current = self.head
while current is not None:
if current.get_data() == item:
# 在找到节点之后,需要判断是否为首节点
if current == self.head:
self.head = current.get_next()
# 判断链表是否只有一个结点
if current.get_next():
current.get_next().set_prev(None)
else:
current.get_prev().set_next(current.get_next())
# 如果存在下一个结点,则设置下一个结点
if current.get_next():
current.get_next().set_prev(current.get_prev())
break
else:
current = current.get_next()
# 查找指定数据是否存在
def search(self, item):
current = self.head
found = False
while current is not None:
if current.get_data() == item:
found = True
current = current.get_next()
return found
def is_empty(self):
return self.head is None
def __len__(self):
return self.size()
def size(self):
count = 0
current = self.head
while current is not None:
count += 1
current = current.get_next()
return count
def show(self):
current = self.head
while current is not None:
print(current.get_data(), end=' ')
current = current.get_next()
print('\n')
if __name__ == '__main__':
d_list = DoubleList()
print(d_list.is_empty())
d_list.add(5)
d_list.add(4)
d_list.add(76)
d_list.add(23)
d_list.show()
d_list.append(48)
d_list.show()
d_list.append(234)
d_list.show()
d_list.insert(2, 100)
d_list.show()
d_list.remove(5)
d_list.show()
print(d_list.search(48))
C:\Users\Sahara\.virtualenvs\test\Scripts\python.exe C:/Users/Sahara/PycharmProjects/test/python_search.py True True Process finished with exit code
python---自己实现双向链表常用功能的更多相关文章
- Python 基本数据类型_常用功能整理
一.字符串 字符串 s ="axle" #去两端空格 s.split() #以什么开头 s.startswith("a") #查找子序列,"12&qu ...
- 【python】【logging】python日志模块logging常用功能
logging模块:应用程序的灵活事件日志系统,可以打印并自定义日志内容 logging.getLogger 创建一个log对象 >>> log1=logging.getLogger ...
- python中time模块常用功能
import time time模块提供了大量对时间进行处理的方法 time.time() # 获取当前时间戳,得到自1970年开始的秒数 >>>time.time() 155487 ...
- python基本数据类型及常用功能
1.数字类型 int -int(将字符串转换为数字) a = " print(type(a),a) b = int(a) print(type(b),b) num = " v = ...
- Python常用功能函数
Python常用功能函数汇总 1.按行写字符串到文件中 import sys, os, time, json def saveContext(filename,*name): format = '^' ...
- python轻量级orm框架 peewee常用功能速查
peewee常用功能速查 peewee 简介 Peewee是一种简单而小的ORM.它有很少的(但富有表现力的)概念,使它易于学习和直观的使用. 常见orm数据库框架 Django ORM peewee ...
- Python常用功能函数总结系列
Python常用功能函数系列总结(一) 常用函数一:获取指定文件夹内所有文件 常用函数二:文件合并 常用函数三:将文件按时间划分 常用函数四:数据去重 Python常用功能函数系列总结(二) 常用函数 ...
- Python OS模块常用功能 中文图文详解
一.Python OS模块介绍 OS模块简单的来说它是一个Python的系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作. 可以查看OS模块的帮助文档: >>> i ...
- python爬虫:一些常用的爬虫技巧
python爬虫:一些常用的爬虫技巧 1.基本抓取网页 get方法: post方法: 2.使用代理IP 在开发爬虫过程中经常会遇到IP被封掉的情况,这时就需要用到代理IP; 在urllib2包中有Pr ...
随机推荐
- bzoj3277-串
Code #include<cstdio> #include<iostream> #include<cmath> #include<cstring> # ...
- 总线复习之SPI
SPI总线协议以ds1302为例讲解 1.1概述. 1.2根据时序图来分析. 1.3再熟读一下DS1302的数据手册和SPI总线协议的使用. 1.4结合ds1302功能实现一定的功能. 1.1概述SP ...
- Redis DeskTop Manager 使用教程
redis desktop manager windows 是一款能够跨平台使用的开源性redis可视化工具. redis desktop manager主要针对redis开发设计,拥有直观强大的可视 ...
- LoadRunner【第二篇】原理及使用流程
loadrunner工作原理 性能测试只关注底层数据,不关注业务,不关注客户端动作.所以,脚本运行正确不一定业务就正确(业务是否正确,如果是查询,我们可以通过检查点来判断:如果是增删改操作,可以看通过 ...
- 从零开始部署javaWeb项目到阿里云上面
[详情请看]http://www.cnblogs.com/softidea/p/5271746.html 补充几点特别需要注意的事情 一:putty相当于阿里云的控制台, WinSCP 相当于是专门上 ...
- 【洛谷P1516】青蛙的约会
题目大意:给定 \(a,b,c\),求线性同余方程 \(ax+by=c\) 的最小正整数解. 题解:首先判断方程是否有解,若 c 不能整出 a 与 b 的最大公约数,则无解.若有解,则利用扩展欧几里得 ...
- 洛谷P2257 YY的GCD 莫比乌斯反演
原题链接 差不多算自己推出来的第一道题QwQ 题目大意 \(T\)组询问,每次问你\(1\leqslant x\leqslant N\),\(1\leqslant y\leqslant M\)中有多少 ...
- (二叉树 递归) leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal
Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- saltstack主机管理项目:编写插件基类-获取主机列表-提取yaml配置文件(四)
一.编写插件基类 1.目录结构 1.我是如何获知我有多少种系统? 当客户端第一连接过来的时候,我就已经把这些文件存下来了 ,存在到哪里了?存到数据库了 每次对主机发送命令的动作时,我从库里把数据取出来 ...
- 第十三节:实际开发中使用最多的监视锁Monitor、lock语法糖的扩展、混合锁的使用(ManualResetEvent、SemaphoreSlim、ReaderWriterLockSlim)
一. 监视锁(Monitor和lock) 1. Monitor类,限定线程个数的一把锁,两个核心方法: Enter:锁住某个资源. Exit:退出某一个资源. 测试案例:开启5个线程同时对一个变量进行 ...