Python—数据结构——链表
数据结构——链表
一.简介
链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构。由一系列节点组成的元素集合。每个节点包含两部分,
数据域item和指向下一个节点的指针next。通过节点之间的相互连接,最终串联成一个链表。
链表中的每个节点包括两个部分:一个是存储数据元素的数据域;另一个是存储下一个节点的地址的指针域
双向链表:双链表的每个节点有两个指针:一个指向后一个节点,另一个指向前一个节点。
二.Python实现
♦链表节点
class Node:
def __init__(self, item=None):
self.item = item
self.next = None
♦单向链表
class SingleLinkedList:
"""
单向链表
""" def __init__(self, heda=None):
self._head = heda
self.length = 0
♦添加节点
头插法:从链表的头部(左端)插入
def add_head(self, element):
"""
头插法:从头部插入
:param element: 需要添加进去的元素
:return:
"""
node = Node(element)
if self._head is None:
self._head = node
else:
node.next = self._head
self._head = node
self.length += 1
尾插法:从链表的尾部(右端)插入
def add_tail(self, element):
"""
尾插法:从尾部添加元素
:param element:需要添加进去的元素
:return:
"""
# 创建一个节点
node = Node(element)
if self._head is None:
self._head = node
else:
cur = self._head
# cur=node,node.next=None
while cur.next:
cur = cur.next
cur.next = node
return cur.next
self.length += 1
♦插入节点
def insert(self, item: Node, index: int):
"""
往链表中指定位置插入值
:param item: 插入的节点
:param index: 插入的位置
:return:
"""
if index < 0 or index > self.length:
print('index out of range')
return
# 构建节点
if isinstance(item, Node):
node_insert = item
else:
node_insert = Node(item)
if index == 0:
node_insert.next = self._head
self._head = node_insert
else:
# 找到index的前一个节点
pre = self._head
for i in range(self.length):
if i == index - 1:
node_insert.next = pre.next
pre.next = node_insert
break
pre = pre.next
self.length += 1
return
♦删除节点
def delete(self, index: int):
"""
删除指定位置的节点
:param index: 节点的位置
:return:
"""
# 判空
if self.is_empty():
print('empty chain')
return
if index < 0 or index > self.length:
print('index out of range')
return if index == 0:
self._head = self._head.next
else:
pre = self._head
for i in range(self.length):
if i == index - 1:
pre.next = pre.next.next
break
pre = pre.next
self.length -= 1
return
♦修改节点
def update(self, item, index: int):
"""
修改节点item值
:param item: 修改之后的值
:param index:节点的位置
:return:
"""
# 判空
if self.is_empty():
print('empty chain')
return
if index < 0 or index >= self.length:
print('index out of range')
return node = self._head
for i in range(self.length):
if i == index:
node.item = item
return
node = node.next
♦获取节点
def get_item(self, index: int):
"""
获取指定位置的节点item
:param index:指定位置
:return:item
"""
# 判空
if self.is_empty():
print('empty chain')
return
if index < 0 or index >= self.length:
print('index out of range')
return node = self._head
for i in range(self.length):
if i == index:
return node.item
node = node.next
♦遍历链表
def traversal(self):
"""链表遍历"""
if self._head is None:
return
else:
cur = self._head
while cur:
print(cur.item)
cur = cur.next
♦反转链表
def reverse(self):
"""
单向链表的反转:Input:1>2>3>4>5
Output:5>4>3>2>1
:return:
"""
if self._head is None or self.size() == 1:
return
else:
pre = None
cur = self._head
while cur is not None:
post = cur.next
cur.next = pre
pre = cur
cur = post
self._head = pre # 逆向后的头节点
self.traversal()
♦双向链表
class Node:
def __init__(self, item=None):
self.item = item
self.next = None
self.prior = None
♦双链表节点删除
♦双链表节点插入
class Node:
def __init__(self, item=None):
self.item = item
self.next = None
self.prior = None class SingleLinkedList:
"""
单向链表
""" def __init__(self, heda=None):
self._head = heda
self.length = 0 def is_empty(self):
"""判断是否为空"""
return self.length == 0 def add_tail(self, element):
"""
尾插法:从尾部添加元素
:param element:需要添加进去的元素
:return:
"""
# 创建一个节点
node = Node(element)
if self._head is None:
self._head = node
else:
cur = self._head
# cur=node,node.next=None
while cur.next:
cur = cur.next
cur.next = node
return cur.next
self.length += 1 def add_head(self, element):
"""
头插法:从头部插入
:param element: 需要添加进去的元素
:return:
"""
node = Node(element)
if self._head is None:
self._head = node
else:
node.next = self._head
self._head = node
self.length += 1 def size(self): """
获取链表的大小
:return:int
"""
count = 0
if self._head is None:
return count else:
cur = self._head
while cur is not None:
count += 1
cur = cur.next
return count def insert(self, item: Node, index: int):
"""
往链表中指定位置插入值
:param item: 插入的节点
:param index: 插入的位置
:return:
"""
if index < 0 or index > self.length:
print('index out of range')
return
# 构建节点
if isinstance(item, Node):
node_insert = item
else:
node_insert = Node(item)
if index == 0:
node_insert.next = self._head
self._head = node_insert
else:
# 找到index的前一个节点
pre = self._head
for i in range(self.length):
if i == index - 1:
node_insert.next = pre.next
pre.next = node_insert
break
pre = pre.next
self.length += 1
return def delete(self, index: int):
"""
删除指定位置的节点
:param index: 节点的位置
:return:
"""
# 判空
if self.is_empty():
print('empty chain')
return
if index < 0 or index > self.length:
print('index out of range')
return if index == 0:
self._head = self._head.next
else:
pre = self._head
for i in range(self.length):
if i == index - 1:
pre.next = pre.next.next
break
pre = pre.next
self.length -= 1
return def update(self, item, index: int):
"""
修改节点item值
:param item: 修改之后的值
:param index:节点的位置
:return:
"""
# 判空
if self.is_empty():
print('empty chain')
return
if index < 0 or index >= self.length:
print('index out of range')
return node = self._head
for i in range(self.length):
if i == index:
node.item = item
return
node = node.next def get_item(self, index: int):
"""
获取指定位置的节点item
:param index:指定位置
:return:item
"""
# 判空
if self.is_empty():
print('empty chain')
return
if index < 0 or index >= self.length:
print('index out of range')
return node = self._head
for i in range(self.length):
if i == index:
return node.item
node = node.next def traversal(self):
"""链表遍历"""
if self._head is None:
return
else:
cur = self._head
while cur:
print(cur.item)
cur = cur.next def reverse(self):
"""
单向链表的反转:Input:1>2>3>4>5
Output:5>4>3>2>1
思路:先将head.next断开,即指向断开的元素pre(none);再将pre赋值head,将head赋值head.next;最后将head赋值pre
:return:
"""
if self._head is None or self.size() == 1:
return
else:
pre = None
cur = self._head
while cur is not None:
post = cur.next
cur.next = pre
pre = cur
cur = post
self._head = pre # 逆向后的头节点
self.traversal()
LinkedList
Python—数据结构——链表的更多相关文章
- Python 数据结构 链表
什么是时间复杂度 时间频度:一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才知道.但是我们不可能也没有必要对每一个算法都进行上机测试,只需要知道那个算法花费的时间多,那个算法花费得 ...
- python数据结构链表之单向链表
单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...
- Python数据结构--链表
class Node(): def __init__(self, dataval=None): self.dataval = dataval self.nextval = None class SLi ...
- Python数据结构——链表的实现
链表由一系列不必在内存中相连的结构构成,这些对象按线性顺序排序.每个结构含有表元素和指向后继元素的指针.最后一个单元的指针指向NULL.为了方便链表的删除与插入操作,可以为链表添加一个表头. 删除操作 ...
- python数据结构与算法——链表
具体的数据结构可以参考下面的这两篇博客: python 数据结构之单链表的实现: http://www.cnblogs.com/yupeng/p/3413763.html python 数据结构之双向 ...
- Python数据结构之单链表
Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...
- python数据结构之链表(一)
数据结构是计算机科学必须掌握的一门学问,之前很多的教材都是用C语言实现链表,因为c有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,有很多都是用模拟链表,不过这次,我不是用模拟 ...
- python数据结构与算法
最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...
- 算法之python创建链表实现cache
算法之python创建链表实现cache 本节内容 问题由来 解决思路 实现代码 总结 1. 问题由来 问题起因于朋友的一次面试题,面试公司直接给出两道题,要求四十八小时之内做出来,语言不限,做出来之 ...
随机推荐
- 吴裕雄--天生自然java开发常用类库学习笔记:ListIterator接口
import java.util.ArrayList ; import java.util.List ; import java.util.ListIterator ; public class Li ...
- ACM-小偷的背包
题目描述:小偷的背包 设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,...,wn.问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S.如果有满足条 ...
- Rabbitmq之高级特性——实现消费端限流&NACK重回队列
如果是高并发下,rabbitmq服务器上收到成千上万条消息,那么当打开消费端时,这些消息必定喷涌而来,导致消费端消费不过来甚至挂掉都有可能. 在非自动确认的模式下,可以采用限流模式,rabbitmq ...
- Arduino nano的bootloader文件烧录
1.买了了nano还没用就用 avrisp烧录器给烧了其他程序,仅仅是的avr单片机了:2.将他恢复成Arduino nano吧. 在Arduino软件安装目录中的hardware\arduino中. ...
- 一百零九、SAP的OO-ALV之三,屏幕绘制器的使用
一.在Screen页面,点击格式,会打开屏幕绘制器 二.点击定制控制,和PS一样画出一个显示区域的画布容器 三.双击之后,在弹出的属性页面写入一个名字,保存 四.激活屏幕后关闭 五.关闭屏幕绘制器之后 ...
- 二十二、JavaScript之在对象中写函数
一.代码如下 二.效果如下 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" conten ...
- 084-PHP文件引用include
02.php <?php $color = 'green'; $fruit = 'apple'; ?> 01.php <?php echo "A $color $fruit ...
- oracle 使用触发器实现id自增
前提:存在数据库di_test,主键为id.1.创建一个索引sequence create sequence di_test_id minvalue 1 nomaxvalue start with 1 ...
- CF1209A Paint the Numbers
You are given a sequence of integers a1,a2,…,an. You need to paint elements in colors, so that: If w ...
- kubernter相关内容
1. Kubernetes 第一章:互联网架构的演变 随着1946年世界上第一台电子计算机的问世网络就随之出现了,只不过当初只是为了解决多个终端之间的连接,这就是局域网的雏形.后来,随着美国国防部高级 ...