这段代码实现了在链表中反转指定范围的节点。以下是对这段代码的逐行解析,帮助你理解其功能:
代码分析
初始化哨兵节点
ListNode dummy(0, head); ListNode* p0 = &dummy;- 创建一个虚拟头节点
dummy,以简化边界情况(如反转从链表头开始的部分)。 - 指针
p0初始化为指向dummy,用于遍历链表。
- 创建一个虚拟头节点
找到左侧位置之前的节点
for (int i = 0; i < left - 1; i++) { p0 = p0->next; }- 将指针
p0移动到左侧位置的前一个节点,这样可以方便地进行链接操作。
- 将指针
初始化反转所需的指针
ListNode* pre = nullptr; ListNode* cur = p0->next;pre用于保存当前节点的前一个节点,初始为nullptr。cur初始化为左侧位置开始反转的第一个节点。
执行反转操作
for (int j = 0; j < right - left + 1; j++) { ListNode* nxt = cur->next; cur->next = pre; pre = cur; cur = nxt; }- 循环从
left到right对链表进行反转:- 保存当前节点的下一个节点到
nxt - 将当前节点的指向改为前一个节点(即完成反转)
- 更新指针:将
pre指向当前节点,继续移动到下一个要处理的节点。
- 保存当前节点的下一个节点到
- 循环从
调整链接以连接已反转部分与未反转部分
p0->next->next = cur; // 左边最后一个结点连接到后面的部分 p0->next = pre; // 左边部分连接上刚才反转好的部分返回新链表头
return dummy.next;- 返回新的链表头,从虚拟头部之后的位置开始。
总结
这个算法利用两个指针和一次循环来高效地逆序链表中的一段元素,其时间复杂度为 O(n),其中 n 是被操作列表长度。通过引入虚拟头结点,可以方便处理边界情况,如需要翻转整个列表或仅涉及链表的一端。
内容由零声教学AI助手提供,问题来源于学员提问




