news 2026/4/23 14:04:06

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/23 11:32:19

12、PHP SPL 迭代器与对象标识全解析

PHP SPL 迭代器与对象标识全解析 1. SPL 基础与对象标识 在 PHP 编程中,标准 PHP 库(SPL)提供了许多实用的功能和工具,帮助开发者更高效地处理数据和对象。其中,对象标识是一个重要的概念。有时候,为类的每个实例分配一个唯一的代码是很有好处的。SPL 为此提供了 spl_…

作者头像 李华
网站建设 2026/4/18 22:22:34

23、深入探索 AJAX、JSON 与 SOAP 实现 Web 服务交互

深入探索 AJAX、JSON 与 SOAP 实现 Web 服务交互 1. AJAX 与 JSON 1.1 服务器端代码示例 以下是一个服务器端代码示例( suggest.php ): <?php $arr = array(Alpha,Bravo,Charlie,Delta,Echo,Foxtrot,Golf,Hotel,India,Juliett,Kilo,Lima,Mike,November,Oscar,Pap…

作者头像 李华
网站建设 2026/4/23 12:25:18

25、高级Web服务与证书认证全解析

高级Web服务与证书认证全解析 高级Web服务概念 在Web服务开发中,有几个高级概念能显著提升服务的功能和性能。 会话与持久化 在PHP中使用SOAP服务时,可以通过以下代码实现会话和持久化功能: ini_set(soap.wsdl_cache_enabled, 0); $server = new SoapServer(demo.wsdl…

作者头像 李华
网站建设 2026/4/23 12:29:29

26、证书认证技术全解析

证书认证技术全解析 1. 证书认证基础与安全建议 证书认证是保障应用和客户端安全的重要手段。在进行证书认证时,对于用于加密存档的密码,可通过电话或信件等方式进行传达。为增强安全性,可考虑部署智能卡或令牌,避免在不使用时将私钥留在客户端机器上。 特别要注意的是,…

作者头像 李华
网站建设 2026/4/23 12:29:31

Dify开源协议解读:商业使用是否受限?

Dify开源协议解读&#xff1a;商业使用是否受限&#xff1f; 在AI应用开发门槛不断降低的今天&#xff0c;越来越多的企业开始尝试将大语言模型&#xff08;LLM&#xff09;集成到业务流程中。然而&#xff0c;从原型验证到生产落地的过程中&#xff0c;团队往往面临提示工程混…

作者头像 李华
网站建设 2026/4/23 13:55:00

计算世界之安生:C++继承的文水和智慧

1.1 继承的概念在C中&#xff0c;继承&#xff08;Inheritance&#xff09; 是面向对象程序设计中的一种机制&#xff0c;它允许程序员在已有类&#xff08;即基类或父类&#xff09;的基础上&#xff0c;扩展或修改功能&#xff0c;从而形成新的类&#xff08;即派生类或子类&…

作者头像 李华