python数据结构之单向链表
1、链表的定义和结构
链表的定义:是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接
链表的结构:data为自定义的数据,next为下一个节点的地址。
2、基本元素
节点:每个节点有两个部分,左边称为值域,存放用户数据;右边部分称为指针域,用来存放指向下一个元素的指针。
节点类定义如下,我们将节点类定义成Node,该类在初始化实例对象时,定义了两个实例变量,其中data用来存储节点的值,next用来存储下一个节点的索引。
head: head节点永远指向第一个节点;
tail: tail永远指向最后一个节点;
None: 链表中最后一个节点的指针域为None值;
3、链表种类
单向链表、单向循环链表、双向链表、双向循环链表
4、手动创建链表示例
class Node:
def __init__(self,data = None, next = None):
self.data = data
self.next = next
# 创建三个节点
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
# 手动链接三个节点
node1.next = node2
node2.next = node3
5、单链表实现
#先定一个node的类
class Node(): #value + next
def __init__ (self, value = None, next = None):
self._value = value
self._next = next
def getValue(self):
return self._value
def getNext(self):
return self._next
def setValue(self,new_value):
self._value = new_value
def setNext(self,new_next):
self._next = new_next
# 实现Linked List及其各类操作方法
class LinkedList():
def __init__(self): # 初始化链表为空表
self._head = Node()
self._tail = None
self._length = 0
# 检测是否为空
def isEmpty(self):
return self._head == None
# add在链表前端添加元素:O(1)
def add(self,value):
newnode = Node(value,None) # create一个node(为了插进一个链表)
newnode.setNext(self._head)
self._head = newnode
# append在链表尾部添加元素:O(n)
def append(self,value):
newnode = Node(value)
if self.isEmpty():
self._head = newnode # 若为空表,将添加的元素设为第一个元素
else:
current = self._head
while current.getNext() != None:
current = current.getNext() # 遍历链表
current.setNext(newnode) # 此时current为链表最后的元素
# search检索元素是否在链表中
def search(self,value):
current=self._head
foundvalue = False
while current != None and not foundvalue:
if current.getValue() == value:
foundvalue = True
else:
current=current.getNext()
return foundvalue
# index索引元素在链表中的位置
def index(self,value):
current = self._head
count = 0
found = None
while current != None and not found:
count += 1
if current.getValue()==value:
found = True
else:
current=current.getNext()
if found:
return count
else:
raise ValueError ('%s is not in linkedlist'%value)
#remove删除链表中的某项元素
def remove(self,value):
current = self._head
pre = None
while current!=None:
if current.getValue() == value:
if not pre:
self._head = current.getNext()
else:
pre.setNext(current.getNext())
break
else:
pre = current
current = current.getNext()
#insert链表中插入元素
def insert(self,pos,value):
if pos <= 1:
self.add(value)
elif pos > self.size():
self.append(value)
else:
temp = Node(value)
count = 1
pre = None
current = self._head
while count < pos:
count += 1
pre = current
current = current.getNext()
pre.setNext(temp)
temp.setNext(current)
参考:
https://blog.csdn.net/qq_30815237/article/details/90750349
合集:
Python数据结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具