链表
- 特性: 链表结构可以充分利用计算机的内存空间,实现灵活的内存动态管理且进行扩展时不需要进行数据搬迁。
- 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是每一个结点(数据存储单元)里存放下一个结点的信息(即地址)
# 实现代码
"""
add(item):链表头部添加元素
travel():遍历整个链表
is_empty():链表是否为空
length():链表长度
append(item):链表尾部添加元素
insert(pos, item):指定位置添加元素
remove(item):删除节点
search(item):查找节点是否存在
"""
class Node:
""" 节点类 """
def __init__(self, item):
self.item = item # 数据
self.next = None # 指向下一个节点的
class Link:
""" 链表 """
def __init__(self):
self._head = None
def add(self, item):
""" 链表头部添加元素 """
node = Node(item) # 实例化一个新数据的节点B
node.next = self._head # 将新节点B的next指向之前头部指向的节点A
self._head = node # 将头部指向新节点B
def travel(self):
""" 遍历整个链表 """
cur = self._head # 将节点D赋值给cur
while cur:
""" 存在节点时,就触发循环 """
print(cur.item)
cur = cur.next # 第一轮就将节点C赋值给cur,依次循环
def is_empty(self):
""" 链表是否为空 """
return self._head is None # 头部指向为空,即空
def length(self):
""" 链表长度 """
count = 0 # 生成一个计数器
cur = self._head # 将节点D赋值给cur
while cur:
""" 存在节点时,就触发循环 """
count += 1 # 跑一次循环,计时器就加1
cur = cur.next
return count
def append(self, item):
""" 链表尾部添加元素 """
node = Node(item) # 实例化一个新节点F
if self._head is None:
""" 说明链表为空 """
self.add(node)
return
cur = self._head # 将节点D赋值给cur
pre = None
while cur:
pre = cur # 将循环最后一轮的节点赋值给pre,即节点A
cur = cur.next
pre.next = node # 将节点A的下一个节点指向新节点F即可
def search(self, item):
""" 查找节点是否存在 """
cur = self._head # 将节点D赋值给cur
while cur:
if cur.item == item:
""" 存在返回True """
return True
else:
cur = cur.next
return False
def insert(self, pos, item):
""" 指定位置添加元素 """
if pos == 0:
self.add(item)
return
node = Node(item)
cur = self._head # 将节点D赋值给cur
pre = None
for i in range(pos):
pre = cur
cur = cur.next
# 要插入的数据就处于pre和cur两个节点之间
pre.next = node
node.next = cur
def remove(self, item):
""" 删除节点 """
cur = self._head
if item == cur.item:
""" 如果删除的是第一个节点 """
self._head = cur.next
return
pre = None
while cur:
pre = cur
cur = cur.next
if cur.item == item:
pre.next = cur.next
return
def reverse(self):
""" 反转 """
pre = None # 节点前一个
cur = self._head # 节点D
n = cur.next # 节点C
while cur:
""" 当cur为空时,也就是此时pre是节点A """
cur.next = pre # 第一轮将节点D的next指向None,因为节点D要成为最后一个节点
pre = cur # 向右偏移一位
cur = n
if cur is not None:
n = n.next
self._head = pre # 循环结束后,此时pre是数据A
link = Link()
link.add(1)
link.add(2)
link.add(3)
link.insert(0, 12)
link.remove(3)
print(link.search(22))
link.reverse()
link.travel()