链表
链表是一种在存储单元上
非连续、非顺序
的存储结构。数据元素的逻辑顺序是通过链表中的指针
链接次序实现。
链表是由一系列的
结点
组成,结点可以在运行时动态生成。每个结点包含两部分:数据域
与指针域
。数据域存储数据元素,指针域存储下一结点的指针。
特点
- 用一组任意的存储单元存储线性表的数据元素
- 利用指针实现了用
不相邻的存储单元
存放逻辑上相邻的元素 - 每个数据元素,除存储本身信息外,还需存储其
直接后继
的信息 - 结点:数据元素的存储映像。
- 数据域:元素本身信息
- 指针域:指示直接后继的存储位置
单链表
n个结点可以链接成一个链表, 如果链表中的每个结点只包含一个指针域, 这个链表就叫做单链表.
单链表的第一个节点的存储位置叫做头指针,最后一个节点的后继指针为空,一般用 NULL 或者 “^” 表示。
有时会在单链表的第一个结点前添加一个结点, 称之为头结点. 该结点一般不存储任何内容, 指针域指向单链表的第一个结点.
插入操作: 在结点p后插入结点s
将s插入结点p和结点p.next之间. 让节点 s 的后继指针指向 p 的后继节点,然后 p 的后继指针指向节点 s
删除操作: 删除结点p的后继节点q
将 p 的后继指针绕过 q,直接指向 q 的后继节点
class LinkNode:
def __init__(self, data):
self.data = data
self.next = None
class LinkList:
def __init__(self):
"""头结点"""
self.head = None
def size(self):
"""从链表头部遍历到链表尾部"""
current = self.head # 记录当前所在结点
count = 0
# 通过判断当前结点是否为空来判断是否处于表尾
while current is not None:
current = current.next
count += 1
return count
def empty(self):
"""判断链表是否为空只需要判断头结点是否为空"""
return self.head == None
def items(self):
"""遍历链表"""
res = []
cur = self.head
# 判断是否处于最后一个结点
while cur is not None:
res.append(cur.data)
cur = cur.next
return res
def add(self, item):
"""头添加"""
node = LinkNode(item)
# 新结点指针指向头结点
node.next = self.head
# 头指针指向新结点
self.head = node
def append(self, item):
"""尾部添加"""
node = LinkNode(item)
# 判断链表是否为空
if self.head is None:
# 头指针指向新结点
self.head = node
else:
# 不是空链表, 找到链表尾部, 将最后一个结点的next指向新结点
cur = self.head
while cur.next != None:
cur = cur.next
cut.next = node
def insert(self, index, item):
"""需要判断插入的位置"""
if index <= 0:
# 直接在头部添加元素
self.add(item)
elif index > self.size():
# 在尾部添加元素
self.append(item)
else:
cur = self.head
node = LinkNode(item)
# 循环到需要插入的位置前一个结点
for i in range(index - 1):
cur = cur.next
node.next = cur.next
cur.next = node
def find(self, item):
return item in self.items()
def remove(self, item):
cur = self.head
previous = None
while cur is not None:
if cur.data == item:
# 第一个结点就是需要删除的结点
if not previous:
# 将头指针指向头结点的后一个结点
cur.head = cur.next
else:
# 将删除位置的前一个结点的next指向删除的结点的后一个结点:
previous.next = cur.next
return True
else:
# 继续寻找下一个结点
previous = cur
cur = cur.next
linkList = LinkList()
linkList.add(1)
linkList.add(2)
linkList.add(3)
linkList.insert(2, 6)
print(linkList.items())
print(linkList.find(4))
linkList.remove(6)
print(linkList.items())
运行结果: