基础知识
-
定义:是一种线性表,单链表一个节点存储当前数据和下一个节点的位置信息(双向链表存储当前数据,前后两个节点的信息)
-
优点 :链表在移动数据操作方面有优势,比如增和删,常用线性表需要移动该数据和之后的所有数据,时间复杂度较大,而链表只需改变位置信息即可
-
缺点:在面对需要大量查找操作时,链表较慢
代码
# 节点类
# 被注释掉为双向链表
class Node:
def __init__(self, date):
self.date = date
# self.pre = None
self.next = None
# 链表类
class Link:
def __init__(self, head=None):
self.head = head
# 初始化链表
# cur开始指向头节点
# 依次实例化节点类 , 并且连接到cur的下一个,再把cur所指的位置向后挪动一位
def create(self, date):
self.head = Node(0)
cur = self.head
for i in range(len(date)):
node = Node(date[i])
cur.next = node
# node.pre = cur
cur = cur.next
# 插入操作
# 首先用count找到所需位置,实例化要插入的节点
# 将要插入位置所在的节点(已在链表中的)的下一位指向要插入的节点,再改变要插入节点的下一个的位置信息
# 例如1,2,3,4中要在2之后插入5
# 即把 2的下一个位置信息改为5,5的下一个位置信息改为3
def insert(self, val, ind):
node = Node(val)
cur = self.head
count = 0
while cur:
if count == ind:
node.next = cur.next
# node.pre = cur
# cur.next.pre = node
cur.next = node
break
count += 1
cur = cur.next
# 删除操作
# 把要删除的数据的前一个节点的所指向的数据改成该节点的下一个节点
# 如 1,2,3删除2 ,即把1指向3 即可
def pop(self, ind):
cur = self.head
count = 1
while cur:
if count == ind:
del_node = cur.next
cur.next = del_node.next
# cur.next.pre = cur
break
count += 1
cur = cur.next
# 打印操作
def print(self):
cur = self.head.next
while cur:
print(cur.date, end=",")
cur = cur.next
print("")
# 演示结果
link = Link()
a = [1, 2, 3, 4, 5]
link.create(a)
link.insert(6, 2)
link.print()
link.pop(1)
link.print()
例题:P1160队列安排
一个学校里老师要将班上 N个同学排成一列,同学被编号为 1∼N,他采取如下的方法:
-
先将 1号同学安排进队列,这时队列中只有他一个人;
-
2∼N 号同学依次入列,编号为 ii 的同学入列方式为:老师指定编号为 i 的同学站在编号为 (i−1) 中某位同学(即之前已经入列的同学)的左边或右边;
-
从队列中去掉 M 个同学,其他同学位置顺序不变。
在所有同学按照上述方法队列排列完毕后,老师想知道从左到右所有同学的编号。