反转链表 ②
反转从位置 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 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
#include<stdio.h>
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* reverseList(ListNode* head,int m,int n) {
// 计算需要逆置的节点个数
int change_len = n-m+1;
// 初始化开始逆置的节点的前驱
ListNode *pre_head = NULL;
// 最终转换后的链表的头节点,用于返回,非特殊情况就是head
ListNode *result = head;
// 移动head到开始修改的节点
while(head && --m){
pre_head = head;
head = head->next;
}
// 将modify_list_tail指向当前的head,即逆置后的链表尾部
ListNode *modify_list_tail = head;
ListNode *new_head = NULL;
while(head && 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->next = new_head;
}else{
result = new_head;
}
return result;
}
};