leetcode92: 反轉鏈表II



一、題目

網址反轉鏈表II

難度:中等。

反轉從位置 m 到 n 的鏈表。請使用一趟掃描完成反轉。

說明:
1 ≤ m ≤ n ≤ 鏈表長度。

示例:

輸入: 1->2->3->4->5->NULL, m = 2, n = 4
輸出: 1->4->3->2->5->NULL

二、程序

思路:需要記錄要反轉鏈表的前驅和後驅,中間鏈表反轉,之後再改變前驅和反轉後最後節點的指針。

在這裏插入圖片描述
在這裏插入圖片描述

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        int len=n-m+1;    //需要反轉鏈表節點的個數
        ListNode* result=head;

        //找到m的前驅節點,並存儲下來
        ListNode* pre_head=NULL;
        while(head && --m)  //這裏只能--m,因爲鏈表的節點從1開始
        {
            pre_head=head;
            head=head->next;
        }

        //開始對m到n之間的鏈表進行反轉
        ListNode* last_head=head;    //反轉後的第n個結點,即爲反轉前的第m個節點
        ListNode* new_head=NULL;
        while(head&&len--)
        {
            ListNode* next=head->next;
            head->next=new_head;
            new_head=head;
            head=next;
        }
        last_head->next=head;

        if(pre_head)
        {
            pre_head->next=new_head;
        }
        else
        {
            result=new_head;
        }
        
        return result;
    }
};

結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章