【蓝桥杯数据结构】链表学习

基础知识

  • 定义:是一种线性表,单链表一个节点存储当前数据和下一个节点的位置信息(双向链表存储当前数据,前后两个节点的信息)

  • 优点 :链表在移动数据操作方面有优势,比如增和删,常用线性表需要移动该数据和之后的所有数据,时间复杂度较大,而链表只需改变位置信息即可

  • 缺点:在面对需要大量查找操作时,链表较慢


代码

# 节点类
# 被注释掉为双向链表
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. 先将 1号同学安排进队列,这时队列中只有他一个人;

  2. 2∼N 号同学依次入列,编号为 ii 的同学入列方式为:老师指定编号为 i 的同学站在编号为 (i−1) 中某位同学(即之前已经入列的同学)的左边或右边;

  3. 从队列中去掉 M 个同学,其他同学位置顺序不变。

在所有同学按照上述方法队列排列完毕后,老师想知道从左到右所有同学的编号。


答案 :
自己研究

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值