news 2026/8/16 15:05:33

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/8/1 6:17:04

9、PHP开发中的反射API、版本控制与单元测试

PHP开发中的反射API、版本控制与单元测试 1. 反射API中的属性添加 1.1 属性概述 属性是编程语言元素,用于为应用程序添加可通过编程访问的元数据,通常用于与可能与代码协同工作的其他程序进行通信。PHP本身不原生支持属性,但可以通过扩展反射能力来添加属性。 1.2 添加属…

作者头像 李华
网站建设 2026/8/8 0:02:27

17、PHP MVC架构与Zend框架入门指南

PHP MVC架构与Zend框架入门指南 1. MVC架构基础 MVC(Model-View-Controller)模式是一种将应用程序分为三个部分的设计模式,即模型(Model)、视图(View)和控制器(Controller)。这种模式主要用于帮助Web应用程序开发工作流,通过定义特定角色让团队更高效地协作,这些角…

作者头像 李华
网站建设 2026/8/8 15:53:17

18、Zend Framework 入门与高级应用指南

Zend Framework 入门与高级应用指南 1. 入门:创建视图与基本功能 在开始使用 Zend Framework 时,首先要为信息创建视图。以客户控制器为例,需要创建一个新目录来存放视图文件。以下是客户视图的代码示例: // application/views/scripts/customers/index.phtml <html&…

作者头像 李华
网站建设 2026/7/30 5:20:42

19、高级 Zend 框架深入解析与应用实践

高级 Zend 框架深入解析与应用实践 配置文件的 XML 方法 在配置应用程序时,除了 INI 文件方法,还可以使用 XML 方法。XML 配置方法具备 INI 方法的所有优点,并且在不同应用程序之间可能具有更好的可移植性。不过,它也存在解析 XML 文件的额外开销。以下是一个 XML 配置文…

作者头像 李华
网站建设 2026/7/28 23:35:57

24、深入探索SOAP Web服务:基础与高级特性

深入探索SOAP Web服务:基础与高级特性 1. SOAP服务器类方法与选项 构建SOAP服务器时,可定义服务所代表的WSDL,并为服务分配各种选项。使用 SoapServer::__construct(mixed $wsdl [, array $options]) 方法,若将 $wsdl 参数设为 null ,则需设置 uri 选项。以下是…

作者头像 李华
网站建设 2026/7/26 8:13:47

如何对一套新的第三方API集成进行测试?

第三方API&#xff08;Application Programming Interface&#xff09;集成是现代软件开发中的常见场景&#xff0c;它允许不同系统间高效交互数据和服务。然而&#xff0c;API集成若未经充分测试&#xff0c;可能导致系统崩溃、数据泄露或性能瓶颈等问题&#xff0c;影响业务连…

作者头像 李华