题目描述
将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n)O(n),空间复杂度 O(1)O(1)。
解题思路
找到开始反转的位置,然后调用反转列表。记住,因为调用反转列表没有考虑头和尾的问题,还需要将头尾单独处理一下,看代码。
代码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
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
ListNode* hh = new ListNode(-1);
hh->next = head;
ListNode* pre = hh;
ListNode* cur = head;
for(int i = 1; i < m; i++)
{
pre = cur;
cur = cur->next;
}
ListNode* tt = pre;
for(int j = m; j <= n; j++)
{
ListNode* temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
tt->next->next = cur; // 反转的第一个元素的下一个为反转之后的第一个
tt->next = pre; // 反转之前的一个元素的下一个为反转之后的第一个
return hh->next;
}
};