反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
tips : 需要用多个指针保存位置m, m-1的结点,然后反转,再把链表接起来,要考虑m=1的特殊情况。
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if( head == NULL || m >= n ) {
return head;
}
int count=0;
ListNode* node=head;
ListNode* node_pre=NULL;
ListNode* node_begin=node;
ListNode* node_t_pre=NULL;
ListNode* node_t_next=node;
while(node!=NULL) {
count++;
if(count==m-1) {
node_pre=node;
node_begin=node->next;
}
node_t_next=node->next;
if(count>=m) {
node->next=node_t_pre;
node_t_pre=node;
}
if(count==n) {
node_begin->next=node_t_next;
if(m==1) {
head=node;
} else {
node_pre->next=node;
}
break;
}
node=node_t_next;
}
return head;
}
};