【性能剖析】Queue vs ConcurrentQueue:多线程场景下的效率权衡与实战选型
2026/4/15 11:26:29
给你单链表的头指针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→5,left=2、right=4 时,反转后为 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* p0=&dx; for(int i=0;i<left-1;i++){ p0=p0->next; }//到达反转区域的前一个结点:p0 ListNode* nxt=nullptr; ListNode* pre=nullptr; ListNode* cur=p0->next;//反转的起始节点:p0->next for(int i=0;i<right-left+1;i++){ nxt=cur->next; cur->next=pre; pre=cur; cur=nxt; } p0->next->next=cur; p0->next=pre; return dx.next; } };