反转链表 ②

反转从位置 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;
    }
};