备战蓝桥杯Day17 - 链表

链表

基本概念

链表是由一系列节点组成的元素集合。

每个节点包含两部分:数据域 item 、指向下一个节点的指针 next

通过节点之间的相互链接,形成一个链表

1. 链表的初始化

python 复制代码
# 手动建立链表
# 链表的初始化
class Node(object):
    def __init__(self, item):
        self.item = item
        self.next = next

# 手动添加链表中的数据
a = Node(1)
b = Node(2)
c = Node(3)
d = Node(4)
# 将节点之间链接起来
a.next = b
b.next = c
c.next = d
# 可通过指针输出想要的数据
print(a)  # 1
print(a.next)  # 2
print(a.next.next)  # 3
print(a.next.next.next)  # 4 

手动添加数据的方式我们不怎么用,有专门的创建链表的方法 ,手动创建我们只需知道了解即可。

2.创建链表

(1).头插法

先把新的节点连到头节点(head)前面

再把头节点head挪到这个新的元素上

代码实现
python 复制代码
def creat_linklist_head(li):
    head = Node(li[0])   # 将列表中的第一个元素设为头节点
    for element in li[1:]:   # 循环遍历链表
        node = Node(element)  # 将链表中的元素设置为一个节点
        node.next = head   # 将元素直接插到头节点的前面
        head = node   # 再将头节点直接挪到前面
    return head   # 返回头节点

(2).尾插法

将尾指针指向下一个元素。

再把尾指针先后挪。

代码实现
python 复制代码
def creat_linklist_tail(li):
    head = Node(li[0])  # 将列表中的第一个元素设为头节点
    tail = head  # 当一开始只有一个节点的时候,头节点和尾节点是同一个
    for element in li[1:]:  # 循环遍历列表读取数据
        node = Node(element)   # 将列表中的元素设置为一个节点
        tail.next = node  # 将尾指针指向新添加的元素
        tail = node  # 尾指针向后移,移到最后一个元素上
    return head  # 返回头节点

3.遍历链表

当链表不为空时,直接循环打印当前元素,并不断指向下一个。

python 复制代码
def print_linklist(lk):
    while lk:
        print(lk.item, end=" ")
        lk = lk.next

# 集合尾插法进行测试
lk = creat_linklist_tail([1,2,3,4])
print_linklist(lk)

运行后可以正常给出遍历结果,但是我不理解他为什么会报错,我跟着视频中教程敲得代码,人家没报错为什么我的报错。等我研究研究。

4.在指定位置插入元素

实现在3和5之间插入数字4.

为了防止数据丢失,首先把节点4连到节点5上,将p.next -> curNode.next

再将curNode的指针指向p,实现链接。curNode.next -> p

代码实现

python 复制代码
class LinkedList:  
    def __init__(self):  
        self.head = None  
  
    def insert(self, data, position=0):  
        new_node = Node(data)  
  
        if self.head is None:  
            self.head = new_node  
            return  
  
        if position == 0:  
            new_node.next = self.head  
            self.head = new_node  
            return  
  
        current = self.head  
        index = 0  
  
        while current is not None and index < position - 1:  
            current = current.next  
            index += 1  
  
        if current is not None:  
            new_node.next = current.next  
            current.next = new_node  
  
    def print_list(self):  
        current = self.head  
        while current:  
            print(current.data)  
            current = current.next  
  
# 使用  
ll = LinkedList()  
ll.insert(1)  
ll.insert(2)  
ll.insert(3, 1)  # 在位置1插入数字3,链表现在变为 1 3 2  
ll.print_list()  # 输出: 1 3 2
相关推荐
轻微的风格艾丝凡1 分钟前
嵌入式定时器计时技巧:用有符号数省略溢出判断的底层逻辑与实践
数据库·算法·dsp开发·嵌入式软件
No0d1es7 分钟前
2025年12月 GESP CCF编程能力等级认证C++四级真题
算法·青少年编程·等级考试·gesp·ccf
用户83562907805115 分钟前
用Python轻松管理Word页脚:批量处理与多节文档技巧
后端·python
CodeByV24 分钟前
【算法题】快排
算法
进击的松鼠25 分钟前
LangChain 实战 | 快速搭建 Python 开发环境
python·langchain·llm
一起努力啊~27 分钟前
算法刷题--长度最小的子数组
开发语言·数据结构·算法·leetcode
rchmin31 分钟前
限流算法:令牌桶与漏桶详解
算法·限流
小北方城市网32 分钟前
第1课:架构设计核心认知|从0建立架构思维(架构系列入门课)
大数据·网络·数据结构·python·架构·数据库架构
leoufung39 分钟前
LeetCode 221:Maximal Square 动态规划详解
算法·leetcode·动态规划
黑符石40 分钟前
【论文研读】Madgwick 姿态滤波算法报告总结
人工智能·算法·机器学习·imu·惯性动捕·madgwick·姿态滤波