反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
思路:
代码:
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
int change_len = n - m + 1;//计算需要逆置的节点个数
ListNode *pre_head = NULL;//初始化开始逆置的节点的前驱
ListNode *result = head;//最终转换后的链表头结点,非特殊情况为head
while(head && --m){//将head向前移动m-1个位置
pre_head = head;
head = head->next;
}
ListNode *modify_list_tail = head;//将modify_list_tail指向当前的head,即逆置后的链表尾
ListNode *new_head = NULL;
while(head && change_len){//逆置change_len个节点
ListNode *next = head->next;
head->next = new_head;
new_head = head;
head = next;
change_len--;
}
modify_list_tail->next = head;//链接逆置后的链表尾与逆置段的后一个节点
if (pre_head){//如果pre_head不空,说明不是从第一个节点开始逆置的m>1
pre_head->next = new_head;//将逆置链表开始的节点前驱与逆置后的头结点链接
}
else{
result = new_head;//如果pre_head为空,说明m==1从第一个节点开始逆置,结果即为逆置后的头结点
}
return result;
}
};