2026/2/16 19:21:24
网站建设
项目流程
建设门户网站都需要什么,网站建设先进个人代表发言,吴江规划建设局网站,网页制作基础教程第二章题目描述给你链表的头节点 head #xff0c;每 k 个节点一组进行翻转#xff0c;请你返回修改后的链表。k 是一个正整数#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍#xff0c;那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部…题目描述给你链表的头节点head每k个节点一组进行翻转请你返回修改后的链表。k是一个正整数它的值小于或等于链表的长度。如果节点总数不是k的整数倍那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值而是需要实际进行节点交换。示例 1输入head [1,2,3,4,5], k 2输出[2,1,4,3,5]示例 2输入head [1,2,3,4,5], k 3输出[3,2,1,4,5]提示链表中的节点数目为n1 k n 50000 Node.val 1000解决方案这段代码的核心功能是以 k 个节点为一组反转单链表若最后剩余节点不足 k 个则保持原有顺序比如链表 1→2→3→4→5、k2 时反转后为 2→1→4→3→5k3 时为 3→2→1→4→5采用「虚拟头节点 分组迭代反转」实现时间复杂度O(n)、空间复杂度O(1)是该问题的经典最优解法。核心逻辑代码先统计链表长度确定可反转的组数再逐组反转并重新拼接核心是复用区间反转链表的逻辑同时通过虚拟头节点简化边界处理初始化与长度统计创建虚拟头节点dx指向原链表头先遍历链表统计总长度len用于判断剩余节点是否够一组分组反转循环只要剩余节点数 ≥ k就对当前组进行反转用pre/cur/nxt三个指针迭代反转当前 k 个节点逻辑与区间反转一致反转完成后将当前组的尾节点原组头指向组后第一个节点cur再将组前驱p0指向组新头pre更新p0为当前组的尾节点作为下一组的前驱并减少剩余长度len - k返回结果最终返回虚拟头节点的next即反转后链表的头节点。总结核心思路先统计长度确定分组数再逐组复用区间反转逻辑用虚拟头节点和前驱指针p0处理每组的首尾连接关键操作每组反转后p0-next-next cur、p0-next pre、p0 nxt是保证链表连续的核心避免分组反转后断裂效率特点一次遍历统计长度 一次遍历分组反转整体时间O(n)、空间O(1)是 k 组反转链表的最优解法。函数源码/** * 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* reverseKGroup(ListNode* head, int k) { ListNode dx(0,head); ListNode* p0dx; int len0; ListNode* tmphead; while(tmp){ len1; tmptmp-next; }//求长度 ListNode* nxtnullptr; ListNode* prenullptr; ListNode* curp0-next;//反转的起始节点p0-next while(lenk){ len-k; //开始反转 for(int i0;ik;i){ nxtcur-next; cur-nextpre; precur; curnxt; } //反转结束开始更新下一次反转条件 nxtp0-next; p0-next-nextcur; p0-nextpre; p0nxt; } return dx.next; } };