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