2026/6/28 22:21:56
网站建设
项目流程
做网站图片存储用什么格式,专做实习生招聘的网站,国家企业信息年度申报系统,岳阳网站项目建设报道题目描述给你单链表的头指针 head 和两个整数 left 和 right #xff0c;其中 left right 。请你反转从位置 left 到位置 right 的链表节点#xff0c;返回 反转后的链表 。示例 1#xff1a;输入#xff1a;head [1,2,3,4,5], left 2, right 4
输出#xff1a;[1…题目描述给你单链表的头指针head和两个整数left和right其中left right。请你反转从位置left到位置right的链表节点返回反转后的链表。示例 1输入head [1,2,3,4,5], left 2, right 4输出[1,4,3,2,5]示例 2输入head [5], left 1, right 1输出[5]提示链表中节点数目为n1 n 500-500 Node.val 5001 left right n解决方案这段代码的核心功能是反转单链表中指定区间 [left, right] 内的节点比如原链表 1→2→3→4→5left2、right4 时反转后为 1→4→3→2→5采用「迭代法 虚拟头节点」实现时间复杂度O(n)、空间复杂度O(1)是区间反转链表的经典解法。核心逻辑代码通过 “定位反转起点 局部反转 重新连接” 三步完成区间反转核心是用虚拟头节点规避头节点反转的边界问题虚拟头节点与定位前驱创建虚拟头节点dx指向原链表头先找到反转区间的前驱节点p0即 left 位置的前一个节点避免反转头节点时的空指针问题局部区间反转以p0-next为起点用pre/cur/nxt三个指针迭代反转 [left, right] 范围内的节点反转逻辑和完整反转链表一致重新连接链表反转完成后将原反转起点的节点现在是反转区间的尾节点指向反转区间后的第一个节点cur再将p0指向反转区间的新头节点pre恢复链表完整性返回结果最终返回虚拟头节点的next即新链表的头节点。总结核心思路用虚拟头节点简化边界处理先定位反转区间前驱再局部反转最后重新拼接链表关键操作反转后p0-next-next cur和p0-next pre是重新连接链表的核心避免区间反转后链表断裂效率特点一次遍历完成定位 反转 拼接时间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* reverseBetween(ListNode* head, int left, int right) { ListNode dx(0,head); ListNode* p0dx; for(int i0;ileft-1;i){ p0p0-next; }//到达反转区域的前一个结点:p0 ListNode* nxtnullptr; ListNode* prenullptr; ListNode* curp0-next;//反转的起始节点p0-next for(int i0;iright-left1;i){ nxtcur-next; cur-nextpre; precur; curnxt; } p0-next-nextcur; p0-nextpre; return dx.next; } };