题目描述
将一个链表m位置到n位置之间的区间反转,要求使用原地算法,并且在一次扫描之内完成反转。
例如:
给出的链表为1->2->3->4->5->NULL, m = 2 ,n = 4,
返回1->4->3->2->5->NULL.
注意:
给出的m,n满足以下条件:
1 ≤ m ≤ n ≤ 链表长度
解题思路
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *reverseBetween(ListNode *head, int m, int n) {
if(head == NULL)
return NULL;
ListNode *root = new ListNode(0); //建立头结点,方便处理
root->next = head;
ListNode *p = head;
ListNode *pre = root;
for(int i = 1; i < m; i++){ //注意循环次数
pre = p;
p = p->next;
}
for(int i = 0; i < n - m; i++){ //翻转,注意次数
ListNode *tmp = p->next; //tmp指向下一个节点
p->next = tmp->next; //p指向tmp后面的链表
tmp->next = pre->next; //将tmp放到pre的后面
pre->next = tmp;
}
return root->next;
}
};