题目描述请编写一个程序实现以下链表操作构建一个单向链表链表中包含一组整数数据。实现在链表的第 n 个位置插入一个元素输出整个链表的所有元素。实现删除链表的第 m 个位置的元素输出整个链表的所有元素。要求使用自定义的链表数据结构。提供一个LinkedList类来管理链表包含构建链表、插入元素、删除元素和输出链表元素的方法。在 main 函数中创建一个包含一组整数数据的链表然后根据输入的 n 和 m调用链表的方法插入和删除元素并输出整个链表的所有元素。输入描述每次输出只有一组测试数据。第一行包含一个整数 k表示需要构建的链表的长度。第二行包含 k 个整数表示链表中的元素。第三行包含一个整数 S表示后续会有 S 行输入每行两个整数第一个整数为 n第二个整数为 x代表在链表的第 n 个位置插入 x。S 行输入后输入一个整数 L表示后续会有 L 行输入每行一个整数 m代表删除链表的第 m 个元素。L 行输入…输出描述包含多组输出。每组第一行输出构建的链表链表元素中用空格隔开最后一个元素后没有空格。然后是 S 行输出每次插入一个元素之后都将链表输出一次元素之间用空格隔开最后一个元素后没有空格如果插入位置不合法则输出 “Insertion position is invalid.”。然后是 L 行输出每次删除一个元素之后都将链表输出一次元素之间用空格隔开最后一个元素后没有空格如果删除后链表长度为 0则不打印链表。如果删除位置不合法则输出 “Deletion position is invalid.”。如果链表已经为空执行删除操作时不需要打印任何数据。定义链表节点classNode:def__init__(self,data):self.datadata self.nextNoneclass Node:– 定义一个名为Node的类用于表示链表中的单个节点。def __init__(self, data):– 节点的构造函数在创建节点对象时自动调用参数data是要存储的数据。self.data data– 将传入的data赋值给该节点的data属性保存节点的值。self.next None– 将节点的next指针初始化为None表示默认不指向任何后续节点新节点通常是链表的末尾。定义链表类1. 初始化方法__init__classLinkedlist:def__init__(self):self.head_nodeNoneself.length0class Linkedlist:– 定义链表类。def __init__(self):– 构造函数在创建链表对象时初始化链表状态。self.head_node None– 链表的头节点指针初始为None表示空链表。self.length 0– 记录链表中节点的个数初始为0。2. 尾部插入方法insertdefinsert(self,data):self.length1new_nodeNode(data)ifself.head_nodeisNone:self.head_nodenew_nodereturnself.head_nodeelse:current_codeself.head_nodewhilecurrent_code.nextisnotNone:current_codecurrent_code.nextcurrent_code.nextnew_nodereturnnew_nodedef insert(self, data):– 定义尾部插入方法参数data是要插入的数据。self.length 1– 链表长度加 1因为即将新增一个节点。new_node Node(data)– 创建新节点对象存储数据data。if self.head_node is None:– 判断链表是否为空头节点为None。self.head_node new_node– 将新节点设为头节点。return self.head_node– 返回新插入的节点头节点。else:– 链表非空需要找到尾节点。current_code self.head_node– 从头部开始遍历。while current_code.next is not None:– 循环直到当前节点的next为None即找到尾节点。current_code current_code.next– 移到下一个节点。current_code.next new_node– 将尾节点的next指向新节点使新节点成为新的尾节点。return new_node– 返回新插入的节点。3. 获取第 n 个节点的方法getdefget(self,n):ifn1ornself.length:returnNonei1current_codeself.head_nodewhilecurrent_codeisnotNone:ifin:returncurrent_code i1current_codecurrent_code.nextreturnNonedef get(self, n):– 定义方法参数n表示要获取的节点位置从 1 开始计数。if n 1 or n self.length:– 检查位置是否合法小于 1 或超过链表长度。return None– 若无效返回None。i 1– 计数器从 1 开始。current_code self.head_node– 从头节点开始遍历。while current_code is not None:– 循环遍历所有节点。if i n:– 如果当前计数等于目标位置n。return current_code– 返回该节点。i 1– 计数器加 1。current_code current_code.next– 移到下一个节点。return None– 如果遍历完仍未找到理论上不会因为已做合法性检查返回None。4. 在指定位置插入节点的方法insert_atdefinsert_at(self,n,data):new_nodeNode(data)ifn1:new_node.nextself.head_node self.head_nodenew_node self.length1returnnew_nodeelse:pre_nodeself.get(n-1)ifpre_nodeisnotNone:new_node.nextpre_node.nextpre_node.nextnew_node self.length1returnnew_nodereturnNonedef insert_at(self, n, data):– 定义在位置n插入节点的方法参数n为插入位置1 为头部data为数据。new_node Node(data)– 创建新节点。if n 1:– 如果插入位置是头部。new_node.next self.head_node– 新节点的next指向原头节点。self.head_node new_node– 将新节点设为头节点。self.length 1– 链表长度加 1。return new_node– 返回新节点。else:– 插入位置不是头部。pre_node self.get(n-1)– 调用get方法获取前一个节点位置n-1。if pre_node is not None:– 如果前驱节点存在位置合法。new_node.next pre_node.next– 新节点的next指向前驱节点原来的下一个节点。pre_node.next new_node– 前驱节点的next指向新节点完成插入。self.length 1– 长度加 1。return new_node– 返回新节点。return None– 如果位置无效前驱节点为None返回None。5. 删除指定位置节点的方法deletedefdelete(self,n):ifself.head_nodeisNone:returnNoneifn1:deleted_nodeself.head_node self.head_nodeself.head_node.nextself.length-1returndeleted_nodeelse:pre_nodeself.get(n-1)ifpre_nodeisnotNoneandpre_node.nextisnotNone:deleted_nodepre_node.nextpre_node.nextpre_node.next.nextself.length-1returndeleted_nodereturnNonedef delete(self, n):– 定义删除位置n的节点的方法。if self.head_node is None:– 如果链表为空。return None– 无法删除返回None。if n 1:– 如果要删除的是头节点。deleted_node self.head_node– 保存被删除的节点原头节点。self.head_node self.head_node.next– 将头节点指向原头节点的下一个节点即删除原头节点。self.length - 1– 链表长度减 1。return deleted_node– 返回被删除的节点。else:– 删除非头节点。pre_node self.get(n-1)– 获取前驱节点。if pre_node is not None and pre_node.next is not None:– 检查前驱节点存在且其后继节点即待删除节点也存在位置合法。deleted_node pre_node.next– 保存待删除节点。pre_node.next pre_node.next.next– 前驱节点的next直接指向待删除节点的下一个节点跳过待删除节点实现删除。self.length - 1– 长度减 1。return deleted_node– 返回被删除的节点。return None– 若位置无效返回None。6. 打印链表的方法print_link_listdefprint_link_list(self):current_codeself.head_nodewhilecurrent_codeisnotNone:ifcurrent_code.nextisnotNone:print(current_code.data,end )else:print(current_code.data)current_codecurrent_code.nextdef print_link_list(self):– 定义打印链表所有节点数据的方法。current_code self.head_node– 从头节点开始。while current_code is not None:– 遍历每个节点。if current_code.next is not None:– 如果当前节点不是最后一个节点即还有后继。print(current_code.data, end )– 打印数据末尾用空格不换行。else:– 如果是最后一个节点。print(current_code.data)– 打印数据并换行。current_code current_code.next– 移到下一个节点这个语句在if/else之后统一执行确保每个节点都移动。主程序逻辑1. 输入初始链表数据kint(input())link_listLinkedlist()elementslist(map(int,input().split()))fordatainelements:link_list.insert(data)k int(input())– 读取一个整数k表示链表初始元素个数但后续代码中实际未使用k仅用于输入格式。link_list Linkedlist()– 创建一个LinkedList对象空链表。elements list(map(int, input().split()))– 读取一行输入按空格分割成字符串列表转换为整数列表elements即为初始元素。for data in elements:– 遍历elements中的每个数据。link_list.insert(data)– 调用insert方法将每个元素依次插入链表尾部。2. 执行插入操作sint(input())foriinrange(s):n,xmap(int,input().split())nodelink_list.insert_at(n,x)ifnodeisnotNone:link_list.print_link_list()else:print(Insertion position is invalid.)s int(input())– 读取一个整数s表示接下来要执行多少次插入操作。for i in range(s):– 循环s次。n, x map(int, input().split())– 读取一行两个整数n和x分别表示插入位置和要插入的数据。node link_list.insert_at(n, x)– 调用insert_at方法在位置n插入值为x的节点并保存返回的节点如果插入成功返回新节点否则返回None。if node is not None:– 如果返回的节点不是None插入成功。link_list.print_link_list()– 打印当前链表的所有元素。else:– 插入失败。print(Insertion position is invalid.)– 输出错误提示。3. 执行删除操作lint(input())forjinrange(l):mint(input())deleted_nodelink_list.delete(m)ifdeleted_nodeisnotNone:link_list.print_link_list()else:print(Deletion position is invalid.)l int(input())– 读取一个整数l表示接下来要执行多少次删除操作。for j in range(l):– 循环l次。m int(input())– 读取一个整数m表示要删除的节点位置。deleted_node link_list.delete(m)– 调用delete方法删除位置m的节点并将被删除的节点若成功或None保存。if deleted_node is not None:– 如果删除成功返回了被删除的节点。link_list.print_link_list()– 打印当前链表。else:– 删除失败位置无效或链表为空。print(Deletion position is invalid.)– 输出错误提示。整体总结模块作用Node类表示链表节点包含数据域data和指针域next。LinkedList类管理整个链表提供插入尾部/指定位置、获取节点、删除节点、打印链表的功能。主程序按照输入格式读取数据依次执行构建链表、多次插入和多次删除操作并在每次操作后输出链表状态或错误信息。整个程序实现了一个单向链表数据结构支持基本操作并处理了边界情况空链表、非法位置。