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

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

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.rhkb.cn/news/399352.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

控制SD图片生成的神经网络模型--ControlNet

ControlNet 是一个通过添加额外条件来控制SD中图像生成的神经网络,可以使用 ControlNet 来做以下事情: 指定人体姿势。 从另一幅图像复制图片的构图。 生成参考图片类似的图像。 将涂鸦图片变成专业的图像。 ControlNet 是用于控制SD的神经网络模型…

8.8 哈希表简单 1 Two Sum 141 Linked List Cycle

1 Two Sum class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {//给的target是目标sum 要返回vector<int> res(2,0);是在num中找加数//首先假设每个输入都是由唯一的结果&#xff0c;而且不适用相同的元素两次一共有n*(n-1)种…

记录前后端接口使用AES+RSA混合加解密

一、前言 由于项目需求&#xff0c;需要用到前后端数据的加解密操作。在网上查找了了相关资料&#xff0c;但在实际应用中遇到了一些问题&#xff0c;不能完全满足我的要求。 以此为基础&#xff08;前后端接口AESRSA混合加解密详解&#xff08;vueSpringBoot&#xff09;附完…

2024.8.7(SQL语句)

一、回顾 1、主服务器 [rootslave-mysql ~]# yum -y install rsync [rootmaster-mysql ~]# yum -y install rsync [rootmaster-mysql ~]# tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar [rootmaster-mysql ~]# ls [rootmaster-mysql ~]# tar -xf mysql-8.0.33-linux-glib…

Python大数据分析——SVM模型(支持向量机)

Python大数据分析——SVM模型&#xff08;支持向量机&#xff09; 认知模型介绍距离计算模型思想目标函数函数与几何间隔 线性可分SVM模型目标函数函数代码 非线性可分SVM模型目标函数函数代码 示例手写体字母识别森林火灾面积预测 认知模型 介绍 超平面的理解&#xff1a;在…

HTML标签简明通俗教程

HTML标签简明通俗教程 基本知识 HTML&#xff1a;是超文本标记语言&#xff08;Hyper Text Markup Language&#xff09;的缩写&#xff0c;它是用于创建网页的标准标记语言。标签是构成HTML文档的基本单位。 【HTML中的标签&#xff08;tag&#xff09;和元素&#xff08;e…

虹科新品 | PDF记录仪新增蓝牙®接口型号HK-LIBERO CL-Y

新品发布&#xff01;HK-LIBERO CE / CH / CL产品家族新增蓝牙接口型号HK-LIBERO CL-Y&#xff01; PDF记录仪系列新增蓝牙接口型号 HK-LIBERO CL-Y HK-LIBERO CE、HK-LIBERO CH和HK-LIBERO CL&#xff0c;虹科ELPRO提供了一系列高品质的蓝牙&#xff08;BLE&#xff09;多用途…

解决Element-ui el-tree数据与显示不对应的问题

如图&#xff1a; 后端返回的权限列表&#xff0c;并没有列表这一项&#xff0c;但是由于父节点 版本打包 为选中状态&#xff0c;导致所有子节点都为选中状态。 实现代码如下&#xff1a; <el-treeref"tree":data"records"show-checkboxnode-key&quo…

BCArchive加密工具实测分享:为何我觉得它很实用?

前言 你是不是经常有这样的烦恼&#xff1a;重要的文件、私密的照片、敏感的资料&#xff0c;总是担心会不小心泄露出去&#xff1f;哎呀&#xff0c;别担心&#xff0c;别担心&#xff0c;我今天要介绍的这款软件&#xff0c;简直就是守护你数据安全的超级英雄&#xff01; 在…

基于Java的流浪动物救助系统---附源码16974

目 录 摘要 1 绪论 1.1 研究背景及意义 1.2 开发现状 1.3论文结构与章节安排 2 流浪动物救助系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析…

webrtc一对一视频通话功能实现

项目效果 实现原理 关于原理我就不做说明&#xff0c;直接看图 WebRTC建立的时序图 系统用例逻辑 搭建环境 turn服务器&#xff1a;Ubuntu24.04搭建turn服务器 mkcert的安装和使用&#xff1a;配置https访问 必须使用https协议&#xff0c; 由于浏览器的安全策略导致的&am…

四数相加2 | LeetCode-454 | 哈希集合 | Java详细注释

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f579;️思路&#xff1a;四数相加 > 两数相加 &#x1f4cc;LeetCode链接&#xff1a;454. 四数相加 II 文章目录 1.题目描述&#x1f34e;2.题解&#x…

php word文档中写入数据

<?phpnamespace app\api\controller;/*** 首页接口*/ class Coursess extends Api {//签订合同public function contract(){$id $this->request->post(id);$qian $this->request->post(qian);if (!$id || !$qian) {$this->error(__(Invalid parameters));…

算法——动态规划:0/1 背包问题

文章目录 一、问题描述二、解决方案1. DP 状态的设计2. 状态转移方程3. 算法复杂度4. 举例5. 实现6. 滚动数组6.1 两行实现6.2 单行实现6.3 优缺点 三、总结 一、问题描述 问题的抽象&#xff1a;给定 n n n 种物品和一个背包&#xff0c;第 i i i 个物品的体积为 c i c_i …

k8s分布式存储-ceph

文章目录 Cephdeploy-ceph部署1.系统环境初始化1.1 修改主机名&#xff0c;DNS解析1.2 时间同步1.3 配置apt基础源与ceph源1.4关闭selinux与防火墙1.5 **创建** ceph **集群部署用户** cephadmin1.6分发密钥 2. ceph部署2.1 **安装** ceph 部署工具2.2 **初始化** mon **节点**…

子串 前缀和 | Java | (hot100) 力扣560. 和为K的子数组

560. 和为K的子数组 暴力法&#xff08;连暴力法都没想出来……&#xff09; class Solution {public int subarraySum(int[] nums, int k) {int count0;int len nums.length;for(int i0; i<len; i) {int sum0;for(int ji; j<len; j) {sumnums[j];if(sum k) {count;}…

mysql注入-字符编码技巧

一、环境搭建 创建数据表 CREATE TABLE mysql_Bian_Man (id int(10) unsigned NOT NULL AUTO_INCREMENT,username varchar(255) COLLATE latin1_general_ci NOT NULL,password varchar(255) COLLATE latin1_general_ci NOT NULL,PRIMARY KEY (id) ) ENGINEMyISAM AUTO_INCREME…

Redis 缓存预热、雪崩、穿透、击穿

缓存预热 缓存预热是什么 缓存预热就是系统上线后&#xff0c;提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候&#xff0c;先查询数据库&#xff0c;然后再将数据缓存的问题&#xff01;用户直接查询事先被预热的缓存数据&#xff01;解决方案 使用 PostConstr…

LeetCode旋转图像

题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3]…

opencv实战项目七:帧差法获取运动车辆蒙版

文章目录 一、简介二、实现方案三、算法实现步骤3.1 取出视频中间帧3.2 帧差法形成运动蒙版&#xff1a; 四、代码整体实现五&#xff1a;效果 一、简介 在智能交通系统中&#xff0c;车辆检测是一项重要的技术&#xff0c;而通常情况下一张图片中无用信息过多会带来额外的计算…