本题来源于 leetcode 92
给定 m和n 要求逆序这段区间内的结点
1->2->3->4->5->NULL
m=2 n=4; 返回
1->4->3->2->5->NULL
由于本人水平有限,代码冗长,大家可以直接前往leetcoe官网看官解
leetcode 反转链表
我的想法是寻找出 关键的几个结点 m结点 m结点前驱 n结点
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) {
ListNode *L=new ListNode();
L->next=head;
ListNode *pre,*last,*p,*q,*t,*q_r;
last=pre=L;
int i=0,j=0;
while(i<m-1){ //pre指向m的前驱
pre=pre->next;
++i;
}
while(j<n){ //last 指向n
last=last->next;
++j;
}
t=last->next; //记录n的后继的位置
last->next=NULL; //先置零,便于中间逆序
q=pre->next; //用于中间的逆序操作
q_r=pre->next; //用于最后连接n的后继
pre->next=last;
p=q->next;
while(q&&p){ //对中间逆序 由于last->next=NULL由此退出循环
ListNode *next; //记录p的后继
next=p->next;
p->next=q; //逆序
q=p; //更新 p q
p=next;
}
q_r->next=t; //连接尾部
return L->next;
}
};