news 2026/4/16 12:32:14

12.25 - 重排链表 NULL与nullptr的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
12.25 - 重排链表 NULL与nullptr的区别

目录

1.重排链表

a.核心思想

b.思路

c.步骤

2.NULL与nullptr的区别


1.重排链表

143. 重排链表 - 力扣(LeetCode)https://leetcode.cn/problems/reorder-list/

/** * 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* reverseList(ListNode* head) { ListNode* prev = nullptr; ListNode* curr = head; while (curr != nullptr) { ListNode* nextTemp = curr->next; curr->next = prev; prev = curr; curr = nextTemp; } return prev; } void reorderList(ListNode* head) { // 处理特殊情况 if (head == nullptr || head->next == nullptr) return; // 找到链表的中点 ListNode* slow = head; ListNode* fast = head; while (fast->next != nullptr && fast->next->next != nullptr) { slow = slow->next; fast = fast->next->next; } // 反转后半部分链表 ListNode* secondHead = reverseList(slow->next); slow->next = nullptr; // 合并两个链表 ListNode* p1 = head; ListNode* p2 = secondHead; while (p2 != nullptr) { ListNode* temp1 = p1->next; ListNode* temp2 = p2->next; p1->next = p2; p2->next = temp1; p1 = temp1; p2 = temp2; } } };

a.核心思想

通过找到链表的中点,将链表分为前后两部分,对后半部分进行反转,然后合并前后两部分,在合并过程中将后半部分的节点逐个插入到前半部分的相邻节点之间,从而实现重排链表的目的。

b.思路

① 找到链表的中点:使用快慢指针法,快指针每次走两步,慢指针每次走一步,当快指针到达链表末尾时,慢指针指向的就是链表的中点。

② 反转后半部分链表:从慢指针的下一个节点开始,反转后半部分链表。

③ 合并链表:将前半部分链表和反转后的后半部分链表进行合并,将后半部分的节点逐个插入到前半部分的相邻节点之间。

c.步骤

① 使用快慢指针找到链表的中点。

② 反转后半部分链表。

③ 合并两个链表。

2.NULL与nullptr的区别

NULL

nullptr

类型与本质

传统上是一个宏定义,通常被定义为0或者(void*)0。在整数上下文中,它就是整数0;在指针上下文中,代表空指针。这可能导致类型推导上的模糊性

是C++11引入的关键字,其类型为std::nullptr_t,是一种明确的空指针类型,能清晰地表示指针值为空

类型安全

由于可能被定义为整数0,在函数重载等场景下,编译器可能将其误判为整数参数,而非指针参数,引发潜在的类型错误

具有明确的指针类型,在函数重载时,编译器能准确识别其为指针,增强了代码的类型安全性

可读性与现代性

C语言遗留的表示方式,在C++代码中使用略显陈旧

是C++11标准的一部分,使代码意图更清晰,更符合现代C++的编程风格

希望这些内容对大家有所帮助!

感谢大家的三连支持!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:13:26

7、PHP 反射 API 与 DocBook 文档编写指南

PHP 反射 API 与 DocBook 文档编写指南 在软件开发中,文档编写和代码的反射机制是两个非常重要的方面。文档能够帮助开发者更好地理解代码的功能和使用方法,而反射机制则可以让程序在运行时动态地获取和操作代码的元数据。本文将详细介绍 DocBook 文档编写的常用元素,以及 …

作者头像 李华
网站建设 2026/4/12 8:00:02

8、PHP反射API:文档数据解析与扩展实战

PHP反射API:文档数据解析与扩展实战 在PHP开发中,反射API为我们提供了强大的能力,让我们能够在运行时检查类、方法、属性等信息。本文将详细介绍如何利用反射API来解析基于反射的文档数据,包括安装必要的工具、访问文档注释数据、对数据进行分词和解析,以及如何扩展反射A…

作者头像 李华
网站建设 2026/4/16 11:57:35

14、PHP SPL 功能在文件操作与数组重载中的应用

PHP SPL 功能在文件操作与数组重载中的应用 1. SPL 文件与目录处理 在文件和目录处理方面,SPL(Standard PHP Library)提供了丰富的功能。 1.1 文件定位与查找 获取路径 :可以通过在 $entry SPLFileInfo 对象上调用 getPathname() 方法来仅获取路径。 正则表达式查…

作者头像 李华
网站建设 2026/4/12 12:26:48

15、PHP 中的 SPL 数组重载与异常处理

PHP 中的 SPL 数组重载与异常处理 1. SPL 数组重载 在 PHP 中,我们可以利用 SPL(标准 PHP 库)的特性,将对象当作数组来使用,这主要通过 ArrayAccess 接口及其定义的四个方法 offsetSet() 、 offsetGet() 、 offsetExists() 和 offsetUnset() 来实现。同时, c…

作者头像 李华
网站建设 2026/4/15 19:28:34

16、深入理解MVC架构:原理、优势与实践

深入理解MVC架构:原理、优势与实践 1. MVC架构概述 MVC(Model-View-Controller)是一种简化应用程序开发和维护的设计模式,它将应用程序划分为三个逻辑组件: - Model(模型) :负责应用程序的业务逻辑,封装对数据存储的访问,并提供可重用的类库。常见功能包括数据库…

作者头像 李华
网站建设 2026/4/14 20:20:13

21、Zend Framework应用指南

Zend Framework应用指南 1. 模块与模型设置 在之前的开发中,我们创建的Zend Framework网站多遵循单控制器/动作层次结构。不过,对于复杂的网站,可添加第三级结构,即模块。模块能让URL遵循 /模块/控制器/动作 的格式,这种URL结构及其底层框架布局被称为常规模块化目录结…

作者头像 李华