class Solution {
public:
ListNode* reverseBetween(ListNode* head, int left, int right) {
ListNode *dummy_node = new ListNode(0);
dummy_node->next = head;
ListNode *pre = dummy_node;
for (int i= 0; i < left -1; i++) {
pre = pre->next;
}
ListNode *iter = nullptr;
ListNode *cur = pre->next;
for (int i = 0; i < right - left; i++) {
iter = cur->next;
cur->next = iter->next;
iter->next = pre->next; // 容易出错
pre->next = iter;
}
return dummy_node->next;
}
};
class Solution {
private:
void reverseLinkedList(ListNode *head) { //参考206
// 也可以使用递归反转一个链表
ListNode *pre = nullptr;
ListNode *cur = head;
while (cur != nullptr) {
ListNode *next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
}
public:
ListNode *reverseBetween(ListNode *head, int left, int right) {
ListNode *dummy_node = new ListNode(-1);
dummy_node->next = head;
ListNode *pre = dummy_node;
for (int i= 0; i < left -1; i++) {
pre = pre->next;
}
// 第 2 步:从 pre 再走 right - left + 1 步,来到 right 节点
ListNode *right_node = pre->next;
for (int i = 0; i < right - left; i++) {
right_node = right_node->next;
}
// 第 3 步:切断出一个子链表(截取链表)
ListNode *letf_node = pre->next;
ListNode *curr = right_node->next;
// 注意:切断链接
pre->next = nullptr;
right_node->next = nullptr;
// 第 4 步:同第 206 题,反转链表的子区间
reverseLinkedList(letf_node);
// 第 5 步:接回到原来的链表中
pre->next = right_node;
letf_node->next = curr;
return dummy_node->next;
}
};