1. 程式人生 > >Reverse linked list(逆轉從n到m處的單鏈表)--leetcode

Reverse linked list(逆轉從n到m處的單鏈表)--leetcode

題目描述:
Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given1->2->3->4->5->NULL, m = 2 and n = 4,
return1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.

解題思路:
找到第m個結點,並記錄其前繼結點,然後依次從m+1開始到n,逆轉後續結點,注意在最後的時候,修改原先第m處的連結串列的next指標。
程式碼如下:

class Solution {
public:
    ListNode *reverseBetween(ListNode *head, int m, int n) {
        if (!head || m < 1 || m == n) return head;

        //前m-1個連結串列
        ListNode *q = NULL; //用q儲存第m-1個結點
        ListNode *p = head; //讓p指向第m個結點
        int count = 1;
        while(count < m && p){
            q = p;
            p = p->next;
            ++count
; } //逆轉m到n個結點 ListNode *end = p;//始終指向逆轉前的第m個結點 ListNode *pre = p;//可以看為逆置連結串列的頭結點 ListNode *pNext = NULL;//指向p的下一個結點 p = p->next;//(指向m+1處的結點) for (count = m+1; count <= n; ++count){ pNext = p -> next;//儲存下一個結點資訊 p -> next = pre;//頭插法
pre = p;//前移pre p = pNext;//回到初始連結串列的下一個結點 } /* 結束的時候,end指向逆轉前的第m個結點(逆轉後,為逆轉連結串列的最後一個結點), pre指向指向逆轉後第m個結點(逆轉前的第n個結點), p指向原連結串列的n+1個結點 */ //連結逆轉連結串列和後面的連結串列 end -> next = p;//這一步,修正了原連結串列第m個結點後項指標 //如果第m-1個結點為空的話,表示,從head開始逆轉 if (q){//不為空,將前m-1個連結串列和逆轉後的連結串列連結 q -> next = pre; }else{//為空,逆轉連結串列的頭結點,就是要求的連結串列 head = pre; } return head; } };

配圖分析:
分析