Python 链表
首先,我们先来了解一下链表:
在线性表中,有一种叫做顺序存储结构,但是在插入和删除的时候需要移动大量的元素,不是很方便,为了解决这个问题,就有了链式存储结构:
为了表示每个数据元素a与其直接后继数据元素b之间的逻辑关系,对数据元素a来说,除了存储其本身的信息之外,还需存储一个指示其后继的信息(即直接后继的存储位置)。我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称为指针或链。这两部分信息组成数据a的存储映像,称为节点(Node)。
N个结点链结成一个链表,即为线性表的链式存储结构,因此此链表的每个结点中只包含一个指针域,所以叫做单链表。
Python 单链表的实现
# 链表中的节点
class Node:
def __init__(self, data):
self.data = data
self.next = None
# 链表:管理节点
class Link:
def __init__(self):
# 表头:链表中的第一个节点
self.head = None
# 在头部添加
def add(self, item):
# 创建一个节点
node = Node(item)
# 判断链表是否为空
if self.head:
# 新节点作为第一个节点,它的next属性指向原来的表头
node.next = self.head
# 新节点作为表头
self.head = node
# 在末尾追加
def append(self, item):
# 创建节点
node = Node(item)
if self.head:
temp = self.head
while temp.next:
temp = temp.next
temp.next = node
else:
self.head = node
# 在指定位置插入节点
def insert(self, position, item):
if position <= 0:
self.add(item)
elif position >= self.length():
self.append(item)
else:
node = Node(item)
count = 0
temp = self.head
# 找到要插入位置的前一个节点
while count < position-1:
temp = temp.next
count += 1
# 新的节点的next指向下一个节点
node.next = temp.next
# 当前节点的next指向新节点
temp.next = node
# 删除元素
def remove(self, item):
# 记录前一个节点
prev = None
temp = self.head
while temp:
if temp.data == item:
prev.next = temp.next
break
else:
prev = temp
temp = temp.next
# 统计链表长度
def length(self):
count = 0
if self.head:
temp = self.head
while temp:
temp = temp.next
count += 1
return count
# 遍历链表
def show(self):
temp = self.head
while temp:
print(temp.data)
temp = temp.next
# 创建链表
link = Link()
# 添加节点
link.add(1)
link.add(2)
link.add(3)
link.add(4)
# 在末尾追加
link.append(5)
link.append(6)
# 在指定位置插入
link.insert(3, 100)
# 删除指定节点
# link.remove(100)
# 遍历链表
link.show()