Solution 1
本题实际上比 25. Reverse Nodes in k-Group 还要简单一点。
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n为输入链表的节点个数,线性遍历即可完成处理
- 空间复杂度: O ( 1 ) O(1) 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* ans = new ListNode();
ans->next = head;
// 找到左侧第一个节点和前一个节点
auto prevHead = ans;
int pos = 1;
while (pos < left) {
head = head->next;
prevHead = prevHead->next;
pos++;
}
auto tail = head;
auto afterTail = tail->next;
while (pos < right) {
auto afterAfterTail = afterTail->next;
afterTail->next = tail;
tail = afterTail;
afterTail = afterAfterTail;
pos++;
}
head->next = afterTail;
prevHead->next = tail;
return ans->next;
}
};
Solution 2
Solution 1的Python实现
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
ans = ListNode()
ans.next = head
prevHead = ans
pos = 1
while pos < left:
head = head.next
prevHead = prevHead.next
pos += 1
tail = head
afterTail = tail.next
while pos < right:
afterAfterTail = afterTail.next
afterTail.next = tail
tail = afterTail
afterTail = afterAfterTail
pos += 1
head.next = afterTail
prevHead.next = tail
return ans.next