题目:
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例:

示例 2:
输入:head = [5], left = 1, right = 1
输出:[5]
提示:
链表中节点数目为 n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
进阶: 你可以使用一趟扫描完成反转吗?
思路:

主要是找到前驱结点,然后从3节点往后,一直左头插法就好了,最后把逆置前头节点,也就是逆置后的尾节点2 ,连接上结束循环时的节点5(其实他是nullptr节点也没关系)。
自己的代码
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int left, int right) {
if (!head || !head->next) { //空节点或者只有一个节点直接返回
return head;
}
ListNode* dummy = new ListNode(-1, head);
ListNode* pre = dummy; //防止left=1,我们给一个虚拟头节点
for (int i = 0; i < left - 1; i++) {
pre = pre->next;
}
ListNode* cur = pre->next; //记录最开始需要翻转的节点,也是反转部分后的尾节点
ListNode* temp = cur->next; //后面要翻转的用头插法插入到pre的后面
int num = right - left;
while (num--&& temp) {
ListNode* next = temp->next;
temp->next = pre->next;
pre->next = temp;
temp = next;
}
cur->next = temp; //最后接起来
head = dummy->next;
delete dummy;
return head;
}
};
复杂度分析:
时间复杂度:O(N): 其中 N 是链表总节点数。最多只遍历了链表一次,就完成了反转。
空间复杂度:O(1): 只使用到常数个变量。
这篇博客介绍了如何使用一次扫描完成单链表指定区间的反转,包括示例、思路解析以及代码实现。核心是通过设置虚拟头节点和辅助指针,实现了在O(N)时间复杂度和O(1)空间复杂度下完成链表反转。
1018

被折叠的 条评论
为什么被折叠?



