题目链接
题目描述
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例
示例1:
输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]
提示
- 链表中节点数目为
n 1 <= n <= 500-500 <= Node.val <= 500-
思路
思路1:迭代(头插法)
思路2:递归
与0206-反转链表类似。
题解
思路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 dummyHead = ListNode(0);dummyHead.next = head;ListNode* prev = &dummyHead;for (int i = 0; i < left - 1; ++i) {prev = prev->next;}ListNode* curr = prev->next;ListNode* next;for (int i = 0; i < right - left; ++i) {next = curr->next;curr->next = next->next;next->next = prev->next;prev->next = next;}return dummyHead.next;}};
思路2:递归
/*** 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 {private:ListNode* processReverse(ListNode* head, int n) {if (n == 0 || head == nullptr || head->next == nullptr) {return head;}ListNode* p = processReverse(head->next, n - 1);ListNode* temp = head->next->next;head->next->next = head;head->next = temp;return p;}public:ListNode* reverseBetween(ListNode* head, int left, int right) {ListNode dummyHead = ListNode(0);dummyHead.next = head;ListNode* prev = &dummyHead;for (int i = 0; i < left - 1; ++i) {prev = prev->next;}prev->next = processReverse(prev->next, right - left);return dummyHead.next;}};
复杂度分析
思路1:迭代(头插法)
时间复杂度:
-
思路2:递归
时间复杂度:
- 空间复杂度:

