链表
链表属于线性表
可以充分利用计算机内存空间,实现灵活的内存动态管理
链表的定义
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个几点(数据存储单元)里存放下一个节点的位置信息(即地址)。
单向链表
单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域),和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
- 表元素域elem⽤来存放具体的数据。
- 链接域next⽤来存放下⼀个节点的位置(python中的标识)
- 变量p指向链表的头节点(⾸节点)的位置,从p出发能找到表中的任意节点。
头结点,首结点 -> 前驱节点->后继节点-> 尾节点
节点实现
单向列表的定义
class Node(object):
"""结点类"""
def __init__(self, item):
# item存放数据元素
self.item = item
# next是下一个节点的标识
self.next = None
单链表的实现
#!/usr/bin/python3
class Node:
"""单链表的节点"""
def __init__(self, item):
# item存放数据元素
self.item = item
# next是下一个节点的标识
self.next = None
class SingleLinkList:
"""单链表"""
def __init__(self, node=None):
# 头节点指向第一个节点
self.__head = node
def __str__(self):
"""遍历列表"""
sll = "["
cur = self.__head
while cur is not None:
sll += str(cur.item)
sll += ", "
cur = cur.next
sll += "]"
return sll
def is_empty(self):
"""判断链表是否为空"""
return self.__head is None
def length(self):
"""链表长度"""
# cur初始时指向头节点
cur = self.__head
count = 0
# 尾节点指向None,当未达到尾部时
while cur is not None:
count += 1
# 将cur后移一个节点
cur = cur.next
return count
def add(self, item):
"""
链表头部添加元素
:param item: 要保存的数据
"""
node = Node(item)
node.next = self.__head
self.__head = node
def append(self, item):
"""列表尾部添加元素"""
node = Node(item)
if self.is_empty():
# 如果链表为空的话,则直接把新节点放在头部
self.__head = node
else:
cur = self.__head
while cur.next is not None:
cur = cur.next
# 退出循环的时候,cur指向尾节点
cur.next = node
def insert(self, pos, item):
"""指定位置添加元素"""
# 在头部添加元素
if pos <= 0:
self.add(item)
# 若指定位置超过链表尾部,则执行尾部插入
elif pos >= self.length():
self.append(item)
# 找到指定位置
else:
cur = self.__head
count = 0
while count < (pos-1):
count += 1
# 退出循环时,cur指向pos的前一个位置
cur = cur.next
node = Node(item)
node.next = cur.next
cur.next = node
def remove(self, item):
"""删除节点"""
cur = self.__head
pre = None
while cur is not None:
# 找到了要删除的元素
if cur.item == item:
# 在头部找到了元素
if cur == self.__head:
self.__head = cur.next
else:
pre.next = cur.next
return
# 没找到元素 移动游标
pre = cur
cur = cur.next
def search(self, item):
"""查找节点是否存在"""
cur = self.__head
while cur is not None:
if cur.item == item:
return True
return False
if __name__ == '__main__':
# 生成链表对象
sll = SingleLinkList()
# 打印链表的长度
print("链表的长度", end=" ")
print(sll.length())
# 打印链表
print(sll)
# 向链表追加节点
sll.append(1)
# 向链表添加节点
sll.add(2)
# 向链表插入节点
sll.insert(0, 3)
# 打印链表
print(sll)
# 判断链表是否为空
print("链表是否为空", end=" ")
print(sll.is_empty())
# 判断节点是否存在
print("判断节点3是否存在", end=" ")
print(sll.search(3))
# 删除节点
sll.remove(3)
# 打印链表
print(sll)
exit(?)