反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
1 , 2, 3, 4 , 5 m=2,n=4
p tail item
1 , 3 , 2 , 4 , 5
p tail item
1 , 4, 3 , 2 ,5
p tail
先找到第m节点的前一个节点用p来表示 ,在找到第m节点用tail来表示,在找到第m节点的后一个节点用item来表示,每次把item节点也就是tail的next节点移动到p节点的后面,一直循环就可以来,永远不改变tail,一直往后顶。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
struct ListNode {
int val;
struct ListNode * next;
};
struct ListNode* reverseBetween(struct ListNode* head, int m, int n) {
struct ListNode h = {0,head};
struct ListNode * p = &h;
struct ListNode * tail;
if(m==n){
return head;
}
for(int i=1;i<=n;i++){
if(i<m){
p= p ->next;
}else if(i==m){
tail = p->next;
}else{
struct ListNode * item = tail->next;
// 1 2 3 4 5
tail->next = tail->next->next;
item->next = p->next;
p->next = item;
}
}
return h.next;
}