从单链表 list 中删除第 i 个元素--Python

从单链表 list 中删除第 i 个元素

一、问题引入

请编写程序,将 n 个整数顺次插入一个初始为空的单链表的表头。随后对任意给定的位序 i,删除链表中第 i 个结点。注意:i 代表位序,从 1 开始。删除结束后,输出链表长度,并顺序输出链表中的每个结点的数值。

输入格式:

输入首先在第一行给出正整数 n(≤10^4);随后一行给出 n 个 int 范围内的整数,数字间以空格分隔;最后一行给出删除位序 i,为 int 范围内的整数。

输出格式:

如果删除的位置不合法,则不能删除,在一行中输出句子 错误:删除位置不合法。。无论是否删除成功,都按照题面描述的要求,在一行中输出链表信息,格式为:

表长: x1 x2 ... xn

注意数字间有 1 个空格分隔,行首尾无多余空格。

输入样例 :

5

1 2 3 4 5

3

输出样例:

4: 5 4 2 1

二、解题步骤

1.思维导图

2.解题步骤

步骤1:创建链表

  1. 初始化一个空链表(使用头结点)
  2. 读取n个整数
  3. 将每个整数插入到链表头部(头插法)

步骤2:删除指定位置节点

  1. 检查删除位置i是否合法(1 ≤ i ≤ 链表长度)
  2. 从头结点开始遍历,找到第i-1个节点
  3. 将第i-1个节点的next指向第i+1个节点
  4. 释放第i个节点的内存

步骤3:输出结果

  1. 根据删除是否成功,计算并输出链表长度
  2. 遍历链表,输出所有节点的值

三、代码实现

python 复制代码
class LNode:
    def __init__(self, data=None):
        self.data = data
        self.next = None

class LinkList:
    def __init__(self):
        self.head = LNode()  # 头结点

    def create_list(self, n):
        """创建链表"""
        for _ in range(n):
            num = int(input())
            new_node = LNode(num)
            new_node.next = self.head.next
            self.head.next = new_node

    def delete_node(self, i):
        """删除链表中第 i 个结点"""
        if i < 1:
            return False
        p = self.head
        j = 1
        while p and j < i:
            p = p.next
            j += 1
        if not p or not p.next:
            return False
        temp = p.next
        p.next = temp.next
        del temp
        return True

    def print_list(self):
        """打印链表"""
        p = self.head.next
        while p:
            print(f" {p.data}", end="")
            p = p.next
        print()

def main():
    # 输入链表长度
    n = int(input())
    
    # 创建链表
    link_list = LinkList()
    link_list.create_list(n)
    
    # 输入删除位置
    i = int(input())
    
    # 删除结点
    if link_list.delete_node(i):
        print(f"{n - 1}:", end="")
    else:
        print("错误:删除位置不合法。")
        print(f"{n}:", end="")
    
    # 打印链表
    link_list.print_list()

# 调用主函数
if __name__ == "__main__":
    main()

四、个人总结

通过本次单链表删除元素的实验,我深入理解了链表数据结构的基本原理和操作方法。在实验过程中,我掌握了头插法创建链表的技巧,认识到这种插入方式能够实现O(1)时间复杂度的插入操作,但会使元素顺序与输入顺序相反。在删除指定位置节点时,我学会了如何通过遍历找到目标节点的前驱节点,这是链表操作中的关键技巧。

实验中遇到的难点主要是边界条件的处理。当删除位置不合法时,需要给出明确的错误提示,这让我意识到健壮的程序必须考虑所有可能的异常情况。通过调试,我发现链表操作中特别需要注意指针的移动和空指针的判断,稍有不慎就会导致程序崩溃或内存泄漏。

这次实践还让我体会到链表与数组的显著差异。链表不需要预先分配连续内存空间,插入删除效率高,但随机访问效率低。在输出结果时,我注意到链表的遍历输出需要特别注意格式控制。通过实验,我不但巩固了理论知识,还提升了实际编程能力。特别是在指针操作和内存管理方面有了更深刻的认识。

相关推荐
上单带刀不带妹7 分钟前
手写 Vue 中虚拟 DOM 到真实 DOM 的完整过程
开发语言·前端·javascript·vue.js·前端框架
im_AMBER27 分钟前
学习日志05 python
python·学习
大虫小呓32 分钟前
Python 处理 Excel 数据 pandas 和 openpyxl 哪家强?
python·pandas
哪 吒44 分钟前
2025B卷 - 华为OD机试七日集训第5期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)
python·算法·华为od·华为od机试·2025b卷
-凌凌漆-1 小时前
【Qt】QStringLiteral 介绍
开发语言·qt
程序员爱钓鱼1 小时前
Go语言项目工程化 — 常见开发工具与 CI/CD 支持
开发语言·后端·golang·gin
军训猫猫头1 小时前
1.如何对多个控件进行高效的绑定 C#例子 WPF例子
开发语言·算法·c#·.net
真的想上岸啊2 小时前
学习C++、QT---18(C++ 记事本项目的stylesheet)
开发语言·c++·学习
明天好,会的2 小时前
跨平台ZeroMQ:在Rust中使用zmq库的完整指南
开发语言·后端·rust
摸爬滚打李上进2 小时前
重生学AI第十六集:线性层nn.Linear
人工智能·pytorch·python·神经网络·机器学习