如何删除链表的中间节点和a/b处的节点?

文章目录

      • 删除中间节点
      • 删除 a/b 处的节点
    • 示例
        • 定义链表节点结构
        • 删除中间节点
        • 删除 a/b 处的节点
      • 注意事项
    • Python 实现案例
      • 创建链表
      • 删除中间节点
      • 删除 a/b 处的节点
      • 测试代码
      • 示例代码完整版
      • 测试输出

在链表中删除中间节点或者特定位置(如 a/b 处)的节点涉及到一些基本的链表操作。下面我将分别解释这两种情况下的处理方法。

删除中间节点

假设“中间节点”是指链表从头到尾节点数量的中间位置。对于长度为偶数或奇数的链表,中间节点的位置可能略有不同。以下是删除中间节点的基本步骤:

  1. 确定中间节点的位置

    • 可以使用快慢指针技术来找到中间节点。快指针每次移动两步,慢指针每次移动一步,当快指针到达链表尾部时,慢指针就在中间位置。
  2. 删除中间节点

    • 当找到了中间节点后,需要调整指针以跳过该节点。如果是单链表,需要让前一个节点指向当前中间节点的下一个节点。
    • 如果是双链表,则只需要调整当前节点的前后指针即可。

删除 a/b 处的节点

删除 a/b 处的节点意味着要删除从头部开始的第 a/b * 链表长度 的节点。这里的 a 和 b 是整数,并且 a < b。具体操作如下:

  1. 计算 a/b 处的位置

    • 首先遍历整个链表来获取链表的长度 N。
    • 计算目标节点的位置 pos = ceil((a / b) * N),这里 ceil 表示向上取整。
  2. 删除指定位置的节点

    • 再次遍历链表直到 pos-1 位置,这里的 pos 是计算得到的位置。
    • 调整 pos-1 位置节点的 next 指针,使其指向 pos+1 位置的节点,从而跳过 pos 位置的节点。

注意:在实际编程中,你需要考虑边界条件,比如链表为空的情况,或者 a/b 导致的位置超出链表范围等。
以上描述的是算法上的逻辑,具体的实现会依赖于使用的编程语言和链表的具体实现方式

示例

接下来我会提供一些伪代码示例来帮助理解如何实现上述两种情况。请注意,这些示例将基于单向链表进行说明。

定义链表节点结构

首先定义一个简单的链表节点结构:

class ListNode:def __init__(self, value=0, next=None):self.value = valueself.next = next
删除中间节点

假设我们已经有一个链表 head,我们将使用快慢指针的方法来找到中间节点并删除它:

def delete_middle_node(head):if not head or not head.next:return Noneslow = headfast = headprev = None# 使用快慢指针找到中间节点while fast and fast.next:fast = fast.next.nextprev = slowslow = slow.next# 删除中间节点if prev:prev.next = slow.nextelse:  # 如果中间节点是头节点head = slow.nextreturn head
删除 a/b 处的节点

为了删除 a/b 处的节点,我们需要首先计算出确切的位置,然后找到该位置的前一个节点,并进行删除操作:

def delete_node_at_position(head, a, b):if not head or not head.next:return Nonelength = 0temp = head# 计算链表的长度while temp:length += 1temp = temp.next# 计算目标位置target_pos = int((a / b) * length)# 特殊情况处理if target_pos == 0:return head.nextcurrent = headcount = 0# 找到目标节点的前一个节点while current and count < target_pos - 1:current = current.nextcount += 1if current and current.next:current.next = current.next.nextreturn head

注意事项

  • 这些函数返回了修改后的链表头节点。
  • 在实际应用中,你可能需要根据具体需求调整边界条件处理。
  • delete_node_at_position 函数假设 ab 是有效的输入,即 a 总是小于 b,并且 a / b 不会超过链表长度的比例。

Python 实现案例

下面是具体的 Python 实现案例,包括创建链表、删除中间节点以及删除 a/b 处节点的完整代码示例。

创建链表

首先,我们需要定义链表节点类,并编写一个函数来创建一个链表:

class ListNode:def __init__(self, value=0, next=None):self.value = valueself.next = nextdef create_linked_list(values):dummy_head = ListNode()current = dummy_headfor value in values:current.next = ListNode(value)current = current.nextreturn dummy_head.next

删除中间节点

接下来,我们实现删除中间节点的功能:

def delete_middle_node(head):if not head or not head.next:return Noneslow = headfast = headprev = None# 使用快慢指针找到中间节点while fast and fast.next:fast = fast.next.nextprev = slowslow = slow.next# 删除中间节点if prev:prev.next = slow.nextelse:  # 如果中间节点是头节点head = slow.nextreturn head

删除 a/b 处的节点

然后,实现删除 a/b 处节点的功能:

def delete_node_at_position(head, a, b):if not head or not head.next:return Nonelength = 0temp = head# 计算链表的长度while temp:length += 1temp = temp.next# 计算目标位置target_pos = int((a / b) * length)# 特殊情况处理if target_pos == 0:return head.nextcurrent = headcount = 0# 找到目标节点的前一个节点while current and count < target_pos - 1:current = current.nextcount += 1if current and current.next:current.next = current.next.nextreturn head

测试代码

最后,我们编写一个测试函数来验证这些功能:

def print_linked_list(head):current = headwhile current:print(current.value, end=" -> ")current = current.nextprint("None")# 创建一个示例链表
values = [1, 2, 3, 4, 5]
linked_list = create_linked_list(values)print("Original Linked List:")
print_linked_list(linked_list)# 删除中间节点
linked_list = delete_middle_node(linked_list)
print("Linked List after deleting middle node:")
print_linked_list(linked_list)# 删除 a/b 处的节点 (例如 a=1, b=2)
linked_list = delete_node_at_position(linked_list, 1, 2)
print("Linked List after deleting node at position 1/2:")
print_linked_list(linked_list)

这段代码将会创建一个包含 [1, 2, 3, 4, 5] 的链表,并演示如何删除中间节点以及删除 a/b 处的节点。你可以根据自己的需要调整 values 列表以及 ab 的值来进行测试。

让我们继续通过具体的例子来测试删除中间节点和 a/b 处节点的功能。

示例代码完整版

以下是完整的 Python 代码示例,包括创建链表、删除中间节点、删除 a/b 处节点以及测试用例:

class ListNode:def __init__(self, value=0, next=None):self.value = valueself.next = nextdef create_linked_list(values):dummy_head = ListNode()current = dummy_headfor value in values:current.next = ListNode(value)current = current.nextreturn dummy_head.nextdef delete_middle_node(head):if not head or not head.next:return Noneslow = headfast = headprev = None# 使用快慢指针找到中间节点while fast and fast.next:fast = fast.next.nextprev = slowslow = slow.next# 删除中间节点if prev:prev.next = slow.nextelse:  # 如果中间节点是头节点head = slow.nextreturn headdef delete_node_at_position(head, a, b):if not head or not head.next:return Nonelength = 0temp = head# 计算链表的长度while temp:length += 1temp = temp.next# 计算目标位置target_pos = int((a / b) * length)# 特殊情况处理if target_pos == 0:return head.nextcurrent = headcount = 0# 找到目标节点的前一个节点while current and count < target_pos - 1:current = current.nextcount += 1if current and current.next:current.next = current.next.nextreturn headdef print_linked_list(head):current = headwhile current:print(current.value, end=" -> ")current = current.nextprint("None")# 创建一个示例链表
values = [1, 2, 3, 4, 5]
linked_list = create_linked_list(values)print("Original Linked List:")
print_linked_list(linked_list)# 删除中间节点
linked_list = delete_middle_node(linked_list)
print("Linked List after deleting middle node:")
print_linked_list(linked_list)# 删除 a/b 处的节点 (例如 a=1, b=2)
linked_list = delete_node_at_position(linked_list, 1, 2)
print("Linked List after deleting node at position 1/2:")
print_linked_list(linked_list)

测试输出

这段代码的预期输出如下:

Original Linked List:
1 -> 2 -> 3 -> 4 -> 5 -> None
Linked List after deleting middle node:
1 -> 2 -> 4 -> 5 -> None
Linked List after deleting node at position 1/2:
1 -> 4 -> 5 -> None

在这个例子中:

  1. 原始链表为 [1, 2, 3, 4, 5]
  2. 删除中间节点(3),链表变为 [1, 2, 4, 5]
  3. 删除 a/b 处的节点(即 a=1, b=2 时,目标位置为 (1/2) * 4 = 2),删除第二个节点(2),链表变为 [1, 4, 5]

你可以根据需要调整 values 列表中的值以及 ab 的值来测试不同的情况。

😍😍 海量H5小游戏、微信小游戏、Web casualgame源码😍😍
😍😍试玩地址: https://www.bojiogame.sg😍😍
😍看上哪一款,需要源码的csdn私信我😍

————————————————

​最后我们放松一下眼睛
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1543050.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

学习干货HVV必学远控工具及Webshell流量合集分析(建议收藏+附面试题)

0x01 前言 本篇文章为各位师傅总结了一些当下流行的Webshell远程工具及其中的流量分析&#xff0c;方便在平时监测、hvv、攻防演练中进行及时发现、阻拦回溯等、在某些比赛上可能也会有类似的流量分析题目&#xff0c;根据工具的一些流量特征进行说明&#xff0c;其中会附带一…

如何融合文本信息提高时序预训练模型?

今天小编给大家介绍两篇联合文本和时序数据进行预训练的文章。 UniTime: A Language-Empowered Unified Model for Cross-Domain Time Series Forecasting 文献地址&#xff1a;https://arxiv.org/pdf/2310.09751.pdf 代码地址&#xff1a;https://github.com/liuxu77/UniTim…

国产 AI 大模型成果展示,囊括 12 大金融应用场景!

前言 随着人工智能技术的飞速发展&#xff0c;国产AI大模型在医疗健康领域的应用日益广泛&#xff0c;正在逐步改变传统的医疗服务模式&#xff0c;提升医疗服务的质量和效率。以下是对国产AI大模型在医疗领域应用的典型案例盘点&#xff0c;覆盖了十大医疗应用场景。 01 智…

治愈系视频素材哪里找?非常优秀的治愈系素材分享

在快节奏的现代生活中&#xff0c;寻找心灵的慰藉成为了一个日益重要的话题。治愈系视频以其温暖人心的内容和独特的魅力&#xff0c;为观众提供了一种减压和放松的方式。要制作出触动人心的治愈系视频&#xff0c;首先需要挑选合适的视频素材。以下是几个优质的治愈系视频素材…

使用build_chain.sh离线搭建匹配的区块链,并通过命令配置各群组节点的MySQL数据库

【任务】 登陆Linux服务器&#xff0c;以MySQL分布式存储方式安装并部署如图所示的三群组、四机构、 七节点的星形组网拓扑区块链系统。其中&#xff0c;三群组名称分别为group1、group2和group3&#xff0c; 四个机构名称为agencyA、agencyB、agencyC、agencyD。p2p_port、cha…

粗绿激光模组使用优势有哪些

在当今高科技飞速发展的时代&#xff0c;激光技术以其精准、高效、稳定的特性&#xff0c;在众多领域中展现出了非凡的应用价值。其中&#xff0c;粗绿激光模组作为激光技术的重要分支&#xff0c;凭借其独特优势&#xff0c;在众多行业中脱颖而出&#xff0c;成为推动产业升级…

格密码(一)

什么是格&#xff1f; 可以简单地把“格”想象成一个用多个点组成的网格&#xff0c;这个网格可以存在于二维、三维甚至更高维的空间中。每个格点都是由一组基向量&#xff08;比如二维空间中的两个基向量&#xff09;通过整数倍的线性组合得到的。 二维格的例子&#xff1a;…

大坝可视化监控:实时安全保障

利用图扑可视化技术实时监控大坝结构和运行状态&#xff0c;及时识别潜在风险&#xff0c;提升管理效率&#xff0c;确保大坝安全稳定运行和资源的高效利用。

实时数据的处理一致性

实时数据一致性的定义以及面临的挑战‍‍‍‍‍ 数据一致性通常指的是数据在整个系统或多个系统中保持准确、可靠和同步的状态。在实时数据处理中&#xff0c;一致性包括但不限于数据的准确性、完整性、时效性和顺序性。 下图是典型的实时/流式数据处理的流程&#xff1a; 1、…

基于单片机多点无线温度监控系统设计

本设计STC89C52RC单片机作为主控芯片&#xff0c;能够远程监控多个位置的温度变化。使用一个主机来接收和监控三个从机收集到的温度信息&#xff0c;利用DS18B20温度传感器采集温度信息&#xff0c;采用GL24S无线通讯模块将数据传输给主机进行接收&#xff0c;信息显示在主机连…

SM2无证书及隐式证书公钥机制签名和加密过程详解(一)

前面介绍SM2无证书及隐式证书公钥机制下用户公私密钥对的Python实现&#xff08;具体参看SM2隐式证书用户公私钥生成python代码实现_sm2 python 密钥生成-CSDN博客&#xff09;&#xff0c;可以看到需由用户和KGC&#xff08;可信密钥生成中心&#xff09;共同参与才能计算得到…

钢表面缺陷识别

钢表面缺陷识别是指通过计算机视觉技术对钢材表面缺陷进行检测和分类的过程。这一技术在钢铁制造行业具有重要的工业价值&#xff0c;旨在提高产品质量、降低生产损失以及提升生产效率。钢表面缺陷可能包括裂纹、凹坑、气泡等&#xff0c;这些瑕疵会影响产品的性能和安全性&…

Transformer动画讲解

**Transformer工作原理**** **一、**** ******GPT的核心是Transformer******** *GPT* &#xff1a; **GPT&#xff08;Generative Pre-trained Transformer&#xff09;**** ****是一种基于单向Transformer解码器的预训练语言模型&#xff0c;它通过在大规模语料库上的无监督…

数字人会被封杀?不!看国家政策打破谣言

数字人会被封&#xff1f; 数字人发展没有前景&#xff1f; 数字人直播何去何从&#xff1f; 是不是大家入局数字人&#xff0c;都在纠结数字人使用和前景的问题&#xff1f;首先&#xff0c;大家放心&#xff0c;数字人广泛使用已经是大势所趋。下面给大家分享最新政策&…

多模态大模型应用开发技术学习

前篇提到多模态模型应用是未来的应用方向&#xff0c;本篇就聊聊技术学习方面的内容。 应用场景 多模态大模型技术的应用场景非常广泛&#xff0c;涵盖了从日常生活到专业领域的各个方面。以下是一些主要的应用场景&#xff1a; 办公自动化&#xff1a;多模态大模型可以用于…

Java线程的创建与使用

线程的概念 线程是‌操作系统能够进行运算调度的最小单位&#xff0c;是进程中的实际运作单位‌。一个进程可以包含多个线程&#xff0c;每个线程是进程中一个单一顺序的控制流&#xff0c;并行执行不同的任务。 线程生命周期 线程的状态是指线程在执行过程中的不同阶段。以…

数位dp(算法篇)

算法篇之数位dp 数位dp 概念&#xff1a; 数位dp是一种计数用的dp&#xff0c;一般是要统计一个区级[l,r]内满足一些条件的数的个数所谓数位dp&#xff0c;就是对数位进行dp&#xff0c;也就是个位、十位等相对于普通的暴力枚举&#xff0c;数位dp快就快在它的记忆化&#x…

打印机问题故障处理_十大打印机故障大全及处理方法

日常办公和生活中&#xff0c;打印机是不可或缺的重要设备。然而&#xff0c;在添加共享或使用共享打印机过程中&#xff0c;经常会遇各种问题。有遇到无法添加打印机、访问共享打印机报错&#xff0c;打印机无法打印等问题&#xff0c;然后这几种错误分别的原因不同&#xff0…

博睿谷IT认证-订阅试学习

在这个信息爆炸的时代&#xff0c;拥有一张IT认证证书&#xff0c;就像拿到了职场晋升的通行证。博睿谷&#xff0c;作为IT认证培训的佼佼者&#xff0c;帮你轻松拿下华为、Oracle等热门认证。下面&#xff0c;让我们一起看看博睿谷如何助你一臂之力。 学习时间&#xff0c;你说…

Fanuc modbusTcp 配置(Robo只能做从站)

需要刷modbusTcp功能包 581800 两个包 插口位置 1CD38A或2CD38B&#xff0c;ip地址可以是固定IP或DHCP IP的设置 MODB_ENBLIO1 才能读写io 注意通讯fanuc是 小端 DI DO都可以