蓝桥杯Python人的自我救赎——基础数据结构(2)

说在前面——摆烂人的觉醒

假期没好好学,现在开始救赎自己,争取300元子不白给了(大哭)

从现在开始我根据视频课来总结知识点(纯干货),并且做题练手!大家一起加油!!


文章目录

说在前面——摆烂人的觉醒

前言

一、链表是什么

数组的缺点

链表的优势

二、链表

0.list操作(复习)

1.单向链表

2.双向链表

3.Python的链表实现

 4.链表相关习题练习

 自行车停放 

 围坐报数

 5.手搓链表

总结


前言

我先从基础数据结构开始,前面的基础操作先略过,我最后填坑
这一章是基础数据结构,主要内容有数组,链表,队列和栈 还有 二叉树
这一篇主要讲解链表(数组的话看上一篇)
以及一些相关习题
(链表一节内容比较少)


一、链表是什么

数组的缺点

数组有两个比较大的缺点
1)需要占用连续的空间若某个数组很大,可能没有这么大的连续空间给它用,
2)不方便删除和插入
例如删除数组中间的一个数据,需要把后面所有的数据往前挪填补这个空位,产生大量的拷贝开销。中间插入数据,也同样不方便操作。

链表的优势

 “链表”能很好的解决上述问题
1)不需要把数据存储在连续的空间上

2)删除和增加数据都很方便
3)链表可以看成是用指针串起来的数组
4)它用一串位于任意位置的存储单元存线性表的数据元素,这些存储单元可以是连续的,也可以不连续。

二、链表

概念:
链表分为单向链表和双向链表
主要差别是一个是只能单向行走,另一个是可以双向走

0.list操作(复习)

在Python中,列表(List)是一种非常灵活和强大的数据结构,它支持多种操作。以下是一些常见的列表操作:
1. 元素访问:你可以通过索引来访问列表中的元素。例如,`list[0]` 将返回列表的第一个元素。
2. 添加元素
   - `append()`:在列表末尾添加一个元素。
   - `extend()`:将另一个列表的所有元素添加到当前列表末尾。
   - `insert()`:在列表的指定位置插入一个元素。
3. 删除元素
   - `remove()`:删除列表中第一个匹配的元素。
   - `pop()`:删除并返回列表中的一个元素,默认是最后一个。
   - `clear()`:删除列表中的所有元素。
4. 搜索元素:使用 `in` 关键字来检查一个元素是否存在于列表中,例如 `if x in list`。
5. 列表切片:你可以通过切片操作来获取列表的一部分。例如,`list[start:end]` 将返回从索引 `start` 到 `end-1` 的元素。
6. 列表推导式:这是一种优雅且简洁的方法,用于从其他列表创建新列表,同时可以筛选元素或对元素进行转换。
7. 排序和反转
   - `sort()`:对列表进行排序。
   - `reverse()`:反转列表中的元素顺序。
8. 列表拼接:使用 `+` 运算符来拼接两个列表。
9. 复制列表:使用 `copy()` 方法来复制一个列表。
这些操作使得列表在Python中非常灵活和强大,适用于各种数据处理场景。有关更详细的操作和示例,你可以参考技术博客,如51CTO博客。由于无法访问脚本之家网站,我无法提供该网站的详细信息。

1.单向链表

指针是单向的,只可以从左往右单向遍历

        指针是单向的,只能从左向右单向遍历数据。比较特殊的是头和尾,为了方便从任何一个位置出发能遍历到整个链表,让首尾相接,尾巴tail的next指针指向头部head的data。由于首尾相接的链表是循环的,所以任意结点都可以成为头和尾。

2.双向链表

 

        每个结点有两个指针,pre指针指向前一结点,next指针指向后一结点。双向链表也是首尾相接,最后结点的next指针指向第一个结点,第一个结点的pre指针指向最后的结点

3.Python的链表实现

因为Python不同于C语言,他的列表list可以当成链表来使用,也可以当作队列、栈使用,可以当成数组
但是!!Python的list不是真正的链表!

#初始化
li = [11,24,3,4,5,6,5]

#在末尾添加61
li.append(61)
print(li)

#统计5的个数
print(li.count(5))

#在5前面插入49
index = li.index(5)    #先找到5的位置
li.insert(index,49)    #在相应位置上插入49
print(li)

#在5后面插入51
index = li.index(5)    #先找到5的位置
li.insert(index+1,51)  #在相应位置上插入51
print(li)

#删除第一个5
li.remove(5)
print(li)

 4.链表相关习题练习

 自行车停放 

本题是很直接的链表

n = int(input())
a = int(input())
bicycles = []        #空链表
bicycles.append(a)
foe i in range(n-1):
    x,y,z = map(int,input().split())
    if z==0:         #判断z的值,确定模式
        bicycles.insert(bicycles.index(y),x)
    else:            #判断z的值,确定模式
        bicycles.insert(bicycles.index(y)+1,x)
for i in bicycles:
    print(i,end=' ')

 围坐报数

 5.手搓链表

class Node():                    # 定义一个节点类Node
    def __init__(self,data):     # Node类的构造函数,初始化data和next
        self.data=data           # 节点存储的数据
        self.next=None           # 指向下一个节点的指针

class SingleLinkList():          # 定义单链表类SingleLinkList
    def __init__(self,node=None):# SingleLinkList类的构造函数
        self.__head=node         # 初始化头节点,默认为None

    def left_insert(self,x,y):   # 定义左插入方法
        pre=self.__head          # pre用于遍历链表,初始指向头节点
        while pre.next.data !=x: # 循环查找值为x的节点
            pre=pre.next
        node=Node(y)             # 创建新节点,其data为y
        node.next=pre.next       # 新节点的next指向pre的下一个节点
        pre.next=node            # pre的next指向新节点,完成左插入

    def right_insert(self,x,y):  # 定义右插入方法
        pre=self.__head          # pre用于遍历链表,初始指向头节点
        while pre.data !=x:      # 循环查找值为x的节点
            pre=pre.next
        node=Node(y)             # 创建新节点,其data为y
        node.next=pre.next       # 新节点的next指向pre的下一个节点
        pre.next=node            # pre的next指向新节点,完成右插入

    def print_list(self):        # 定义打印链表方法
        cur=self.__head          # cur用于遍历链表,初始指向头节点
        while cur != None:       # 遍历链表
            print(cur.data,end=' ') # 打印当前节点的data
            cur=cur.next         # 移动到下一个节点

# 以下为使用链表的代码
n = int(input())                # 输入链表长度n
a = int(input())                # 输入链表第一个节点的值a
node = Node(a)                  # 创建第一个节点
li=SingleLinkList(node)         # 创建链表对象,头节点为node
for i in range(n-1):            # 循环n-1次,插入剩余节点
    x,y,z = map(int, input().split()) # 输入三个整数,分别为x,y,z
    if z==0:                    # 如果z为0,执行左插入
        li.left_insert(y,x)
    else:                       # 否则执行右插入
        li.right_insert(y,x)
li.print_list()                 # 打印链表

总结

        本文首先介绍了链表的概念,并指出了数组的缺点,然后详细介绍了链表的优势,包括单向链表和双向链表的定义和特点。
        接着,通过Python的列表操作,展示了链表的一些基本操作,如添加、统计、插入和删除等。
        然后,通过两个习题,巩固了对链表的理解。
        最后,手写了链表的实现,包括节点类和单链表类的定义,以及一些基本操作的实现。
        总结来说,本文全面而深入地介绍了链表的概念、特点、操作和实现,对于想要深入学习计算机科学和数据结构的人来说,是一篇非常有价值的文章。
        以上就是今天要讲的内容(由AI生成~)

希望开第二个好头,争取日更!就当自我救赎了。(面试过了~幸运!)

 栗花落香奈乎再漂亮一次(手动滑稽)

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值