LeetCode-92-反转列表2

反转从位置 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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章