链表的奇偶节点重新排列及空指针问题分析【链表、空指针】

news2024/11/16 0:51:06

在处理链表问题时,重组链表节点是一种常见需求。本文将详细探讨如何在链表中将奇数索引节点放在偶数索引节点之前,并深入分析实现过程中的空指针问题及其解决方案。

1. 问题描述

给定一个单链表,要求将链表中的节点按照奇数索引节点在前、偶数索引节点在后的顺序重新排列。节点索引从1开始,第一个节点为奇数位置,第二个节点为偶数位置,依此类推。

示例 1
在这里插入图片描述

输入: [1, 2, 3, 4, 5]
输出: [1, 3, 5, 2, 4]

示例 2:

在这里插入图片描述

输入: head = [2,1,3,5,6,4,7]
输出: [2,3,6,7,1,5,4]

问题来源:328. 奇偶链表 - 力扣(LeetCode)

2. 解决方案

我们可以通过两个指针(oddeven)分别追踪奇数索引节点和偶数索引节点,并通过交替操作这些指针来重新排列链表。

实现步骤
  1. 初始化指针

    • odd 指向链表的第一个节点,即奇数索引节点的头节点。
    • even 指向链表的第二个节点,即偶数索引节点的头节点。
    • evenHead 保存偶数节点链表的头,以便最后将奇数链表与偶数链表连接。
  2. 循环遍历链表

    • eveneven->next 都存在的前提下,依次重新链接奇数和偶数节点:
      • 先将 odd 指针指向的节点连接到下一个奇数节点上。
      • 再将 even 指针指向的节点连接到下一个偶数节点上。
  3. 连接两个链表

    • 最后,将奇数链表的最后一个节点的 next 指针指向偶数链表的头节点 evenHead,完成链表的重组。

3. 代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        if (!head) return nullptr;  // 空链表直接返回

        ListNode* odd = head;  // 奇数节点的指针
        ListNode* even = head->next;  // 偶数节点的指针
        ListNode* evenHead = even;  // 保存偶数节点链表的头部

        // 交替更新奇数和偶数节点链表
        while (even && even->next) {
            odd->next = even->next;  // 将奇数节点指向下一个奇数节点
            odd = odd->next;  // 将奇数指针移动到下一个奇数节点

            even->next = odd->next;  // 将偶数节点指向下一个偶数节点
            even = even->next;  // 将偶数指针移动到下一个偶数节点
        }

        // 连接奇数和偶数节点链表
        odd->next = evenHead;

        return head;
    }
};

4. 空指针问题分析

在实现过程中,代码中可能出现一个常见的错误:未正确处理链表节点更新的顺序,从而导致访问空指针。以下详细分析为什么需要优先移动 odd 指针,以及为什么先移动 even 指针会导致空指针异常。

错误示例
even->next = odd->next;
even = even->next;
odd->next = even->next;  // 这里可能会出现空指针访问
odd = odd->next;

问题分析

  1. 偶数指针先移动的危险

    • 假设我们首先更新 even 指针。当 even 指向链表的末尾(特别是在链表长度为偶数的情况下),even->next 可能为 nullptr。此时,odd->next 也变为 nullptr。如果在这种情况下继续访问 odd->next->next,就会导致访问空指针,触发运行时错误。
  2. 正确的指针更新顺序

    • 为了避免上述问题,我们应首先更新 odd 指针,然后再更新 even 指针。这是因为当我们移动 odd 指针时,odd->next 始终指向一个有效的奇数节点,保证了链表的结构不被破坏。随后再更新 even 指针,确保其安全性和有效性。

5. 解决方法

为了避免空指针问题,我们需要遵循以下几点原则:

  • 先更新 odd 指针,再更新 even 指针:这样可以确保在整个操作过程中,oddeven 指针总是指向有效的节点,避免空指针访问。
  • 链表末尾处理:在循环过程中,条件判断 while (even && even->next) 确保了 even 指针不会在不合法的位置进行访问,从而避免了潜在的空指针错误。

6. 总结

链表的奇偶节点重新排列是一个经典的链表操作问题,旨在考察对链表操作顺序的理解与把握。通过正确处理指针的更新顺序,我们可以有效避免空指针异常,确保代码的健壮性。在实现过程中,务必注意链表节点之间的依赖关系,确保每一步操作都建立在正确的逻辑基础之上。

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

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

相关文章

掌握 PyTorch 张量乘法:八个关键函数与应用场景对比解析

PyTorch提供了几种张量乘法的方法,每种方法都是不同的,并且有不同的应用。我们来详细介绍每个方法,并且详细解释这些函数有什么区别: 1、torch.matmul torch.matmul 是 PyTorch 中用于矩阵乘法的函数。它能够处理各种不同维度的张…

HTML零基础自学笔记(下)篇一 -8.8

HTML零基础自学笔记(下)---之表格标签详解 参考:pink老师篇一、表格标签是什么?基础内容(主要作用、基本语法、标签释义、属性)主要作用基本语法标签释义表格结构标签属性 合并单元格代码练习代码运行效果&…

IDEA 报错,无效的源发行版 无效的目标发行版:22

报错内容: 在编译项目的时候出现报错: 解决办法: 无效的源发行版 原因:编译的JDK版本与发布版本不一致 File -> Project Structure ->Project Settings 让其中的三处版本保持一致,具体操作如下: …

Vue3+Element-plus+setup使用vuemap/vue-amap实现高德地图API相关操作

首先要下载依赖并且引入 npm安装 // 安装核心库 npm install vuemap/vue-amap --save// 安装loca库 npm install vuemap/vue-amap-loca --save// 安装扩展库 npm install vuemap/vue-amap-extra --save cdn <script src"https://cdn.jsdelivr.net/npm/vuemap/vue-a…

linux反向代理原理:帮助用户更好地优化网络架构

Linux反向代理原理详解 反向代理是一种在网络架构中常用的技术&#xff0c;尤其在Linux环境下被广泛应用。它可以帮助实现负载均衡、安全防护和请求缓存等功能。本文将深入探讨Linux反向代理的原理、工作机制以及其应用场景。 1. 什么是反向代理 反向代理是指代理服务器接收客…

HarmonyOS Developer之图片帧动画播放器

创建image-animator组件 在pages/index目录下的hml文件中创建一个image-animator组件&#xff0c;css文件中编写组件样式&#xff0c;js文件中引用图片。 设置image-animator组件属性 添加iteration&#xff08;播放次数&#xff09;、reverse&#xff08;播放顺序&#xf…

SSM宠物商城-计算机毕业设计源码23666

摘 要 近年来&#xff0c;社会的发展和进步以及人们生活水平的提高&#xff0c;人们饲养宠物的习惯也越来越重视。很多家庭都把宠物视为家庭的重要成员。宠物不仅能给自己作伴&#xff0c;而且在生活中能充当自己精神的支柱&#xff0c;缓解压力、放松心态的伙伴。宠物不同于一…

Koa商城项目-轮播图模块(前端)

前言 通过这次独自做前后端发现有很多需要提升的地方&#xff0c;很多细节处理不到位。下面简单看一下本人自己做的效果吧~~ Git地址 https://gitee.com/ah-ah-bao/koa_system 效果图 前端代码 api/banner.ts import request from "../utils/request";export con…

Mapreduce_wordcount自定义单词计数

自定义的wordcount 数据处理过程 加载jar包 查看后面的pom文件 以上为需要的jar包路径&#xff0c;将其导入至idea中 Map package com.hadoop;import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; im…

计算机毕业设计选题推荐-宠物管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【彻底关闭win10 or 11系统自动更新】

直接上干货 win10或者win11自动更新后系统有bug&#xff0c;太闹心了&#xff0c;是时候选择一个稳定版本彻底关闭更新了 第一步&#xff1a; 在win11左下方搜索框输入&#xff1a;powershell&#xff0c; 选择「Windows PowerShell (管理员)」 第二步&#xff1a; 在 Wind…

FreeSWITCH

1概述 FreeSWITCH https://signalwire.com/freeswitch是一个开源的电话交换平台。官方给它的定义是–世界上第一个跨平台的、伸缩性极好的、免费的、多协议的电话软交换平台。由这个定义我们可以得出以下几点: FreeSWITCH是跨平台的。它能原生地运行于Windows、MaxOSX、Linux、…

智启万象 | Web 开发智能升级、简单易用

AI 的融入使 Web 的功能更加强大 同时也更加简单易用 一起回顾 2024 Google 开发者大会 了解 Web 开发 UI 功能和 OS 集成的最新创新 以及如何通过这些创新来打造卓越的应用体验 Web 不断的革新与发展&#xff0c;不仅为全球数十亿用户提供了丰富多样的在线体验&#xff0c;也为…

HCIP | 重发布实验

要求&#xff1a; 1.如图搭建网络拓扑&#xff0c;所有路由器各自创建一个环回接口&#xff0c;合理规划IP地址 2.R1-R2-R3-R4-R6之间使用OSPF协议&#xff0c;R4-R5-R6之间使用RIP协议 3.R1环回重发布方式引入OSPF网络 4.R4/R6上进行双点双向重发布 5.分析网络中出现路由…

人工智能在肿瘤亚型分类领域的研究进展|顶刊速递·24-08-13

小罗碎碎念 文献日推主题&#xff1a;人工智能在肿瘤亚型分类领域的研究进展 昨天晚上在研究鼻咽癌的病理学诊断指南&#xff0c;看到了下面这段话的时候&#xff0c;我问了自己一个问题——通过AI识别出肿瘤亚型的根本目的是什么&#xff1f;可以衔接哪些具体的下游任务&#…

「栈」实现LIFO栈(先进后出栈|堆栈|stack)的功能 / 手撕数据结构(C++)

概述 栈&#xff0c;是一种基本的数据结构&#xff0c;也是一种数据适配器。它在底层上以链表方法或动态数组方法实现。 队列的显著特点是他的添加元素与删除元素操作&#xff1a;先加入的元素总是被先弹出。 一个队列应该应该是这样的&#xff1a; --------------STACK----…

UE网络同步(一) —— 一个项目入门UE网络同步之概念解释

最近在学习UE网络同步&#xff0c;发现了一个非常好的教程&#xff0c;并且附带了项目文件&#xff0c;这里从这个小项目入手&#xff0c;理解UE的网络同步 教程链接&#xff1a;https://www.youtube.com/watch?vJOJP0CvpB8w 项目链接&#xff1a;https://github.com/awforsyt…

单片机内存映射

在一些桌面程序中&#xff0c;整个内存映射是通过虚拟内存来进行管理的&#xff0c;使用一种称为内存管理单元(MMU)的硬件结构来将程序的内存映射到物理RAM。在对于 RAM 紧缺的嵌入式系统中&#xff0c;是缺少 MMU 内存管理单元的。 因此在一些嵌入式系统中&#xff0c;比如常用…

Python 设计模式之适配者模式

文章目录 从电源适配器谈起实现适配器模式的两种方式object adapterclass adapter 从电源适配器谈起 适配者模式属于结构型设计模式&#xff0c;它的目的是使不兼容的两个对象能够相互工作。 常见的生活例子&#xff1a;去欧美国家旅游时&#xff0c;由于插口和电压不一样&am…

2024年【四川省安全员B证】新版试题及四川省安全员B证模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 四川省安全员B证新版试题是安全生产模拟考试一点通总题库中生成的一套四川省安全员B证模拟考试&#xff0c;安全生产模拟考试一点通上四川省安全员B证作业手机同步练习。2024年【四川省安全员B证】新版试题及四川省安…