说在前面——摆烂人的觉醒
假期没好好学,现在开始救赎自己,争取300元子不白给了(大哭)
从现在开始我根据视频课来总结知识点(纯干货),并且做题练手!大家一起加油!!
文章目录
前言
我先从基础数据结构开始,前面的基础操作先略过,我最后填坑
这一章是基础数据结构,主要内容有数组,链表,队列和栈 还有 二叉树
这一篇主要讲解链表(数组的话看上一篇)
以及一些相关习题
(链表一节内容比较少)
一、链表是什么
数组的缺点
数组有两个比较大的缺点
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生成~)
希望开第二个好头,争取日更!就当自我救赎了。(面试过了~幸运!)
栗花落香奈乎再漂亮一次(手动滑稽)