2026/3/5 22:36:53
网站建设
项目流程
网站建设产品服务,短网址生成在线,wordpress抽奖源码,php ajax网站开发典型实例pdf题目描述给定一个单链表 L 的头节点 head #xff0c;单链表 L 表示为#xff1a;L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为#xff1a;L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …不能只是单纯的改变节点内部的值#xff0c;而是需要实际的进行节点交换。…题目描述给定一个单链表L的头节点head单链表L表示为L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …不能只是单纯的改变节点内部的值而是需要实际的进行节点交换。示例 1输入head [1,2,3,4]输出[1,4,2,3]示例 2输入head [1,2,3,4,5]输出[1,5,2,4,3]提示链表的长度范围为[1, 5 * 104]1 node.val 1000解决方案这段代码的核心功能是重排单链表将链表调整为「原链表前半部分节点 后半部分反转后的节点」交替拼接的形式比如原链表 1→2→3→4→5 变为 1→5→2→4→31→2→3→4 变为 1→4→2→3通过「找中点 反转后半段 交替拼接」三步实现时间复杂度O(n)、空间复杂度O(1)是该问题的最优解法。核心逻辑代码整合了 “找链表中点”“反转链表” 两个基础操作再通过双指针交替拼接完成重排全程无额外空间开销第一步找链表中点调用midNode函数快慢指针法找到链表中间节点mid将原链表拆分为前半段head开头和后半段mid开头第二步反转后半段调用reverseNode函数反转后半段链表得到反转后的后半段头节点head2第三步交替拼接用两个指针分别遍历前半段和反转后的后半段逐个将后半段节点插入前半段节点之间直到后半段只剩最后一个节点避免链表成环完成重排。总结核心思路将重排问题拆解为 “找中点拆分 反转后半段 交替拼接” 三个基础链表操作化繁为简关键细节拼接时循环条件为head2-next而非head2避免最后拼接导致链表闭环效率优势三步操作均为一次遍历整体时间O(n)、空间O(1)是重排链表的最优解法。函数源码/** * 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* midNode(ListNode* head){ ListNode* slowhead; ListNode* fasthead; while(fast fast-next){ slowslow-next; fastfast-next-next; } return slow; } //反转链表 ListNode* reverseNode(ListNode* head){ ListNode* prenullptr; ListNode* curhead; ListNode* nxtnullptr; while(cur){ nxtcur-next; cur-nextpre; precur; curnxt; } return pre; } void reorderList(ListNode* head) { ListNode* mid midNode(head); ListNode* head2reverseNode(mid); ListNode* nxtnullptr; ListNode* nxt2nullptr; while(head2-next){ nxthead-next; nxt2head2-next; head-nexthead2; head2-nextnxt; headnxt; head2nxt2; } } };