反转从位置 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;
}
};
链表区间反转算法
本文介绍了一种在链表中反转指定区间[m, n]的高效算法,通过一趟扫描完成,适用于1≤m≤n≤链表长度的情况。示例展示了输入链表1->2->3->4->5->NULL,m=2,n=4时,如何输出1->4->3->2->5->NULL。特别注意m=1的特殊情况处理。
959

被折叠的 条评论
为什么被折叠?



