题解 | #链表内指定区间反转#
链表内指定区间反转
http://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
方法:迭代
思路:用反转链表的三指针法反转指定区域。然后,再进行接头,连尾。
注意:应当对m是不是头结点进行分类讨论,这里决定了连接的操作。
/**
* 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) {
//迭代法:一次遍历
if (m == n)
{
return head;
}
ListNode* pre = nullptr; //指向待反转结点的前一个结点
ListNode* cur = head; //指向待反转结点
ListNode* nex = nullptr; //指向待反转结点的下一个结点
ListNode* mark = nullptr; //标记m的前一个结点
int i = 1;
while (cur && i < m) //让cur指向m
{
mark = cur;
cur = cur->next;
++i;
}
while (cur && i <= n) //反转
{
nex = cur->next;
cur->next = pre;
pre = cur;
cur = nex;
++i;
}
//对mark进行分类讨论
if (mark) //m不是头结点
{
mark->next->next = cur; //连尾
mark->next = pre; //接头
}
else //m是头结点
{
head->next = cur; //连尾
head = pre; //接头
}
return head;
}
};
时间复杂度:O(n),遍历一次链表
空间复杂度:O(1)
空间复杂度:O(1)