题解 | 链表内指定区间反转
链表内指定区间反转
https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
该题与反转链表类似,只需要找到反转的开头与结尾即可
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
#include<iostream>
using namespace std;
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
ListNode* reverseBetween(ListNode* head, int m, int n) {
// write code here
if (head == NULL || m == n) {
return head;
}
ListNode* reverse_head = head;
ListNode* reverse_head_next;
ListNode* reverse_rear = head;
ListNode* link_node;
// 判断是否需要前部链接
int m_copy = m;
// 获取反转区间的头和尾
while(m > 1) {
if (m == 2) {
link_node = reverse_head;
}
reverse_head = reverse_head->next;
m--;
}
reverse_head_next = reverse_head->next;
while (n > 1) {
reverse_rear = reverse_rear->next;
n--;
}
while(reverse_head != reverse_rear) {
reverse_head->next = reverse_rear->next;
reverse_rear->next = reverse_head;
reverse_head = reverse_head_next;
reverse_head_next = reverse_head->next;
}
// 前面需要再进行链接
if (m_copy != 1) {
link_node->next = reverse_rear;
return head;
} else {
return reverse_rear;
}
}
};