反轉鏈表1-2

反轉鏈表——leetcode:92/206題

簡單篇

  1. 示例:
    輸入: 1->2->3->4->5->NULL
    輸出: 5->4->3->2->1->NULLc++

    c++版web

    /**
             * Definition for singly-linked list.
             * struct ListNode {
             *     int val;
             *     ListNode *next;
             *     ListNode(int x) : val(x), next(NULL) {}
             * };
             */
                class Solution {
                   public:
                          ListNode* reverseList(ListNode* head) {
                          ListNode*new_head=NULL;
                          while(head)//(當鏈表不爲空,即還有節點沒有反轉)
                          {
                          ListNode*next;//  作存儲
                          next=head->next;//(保存鏈表在該反向節點的後一個節點)
                           head->next=new_head;//(鏈表反向,舊頭結點反)
                           new_head=head;//(新頭節點後移到剛剛反轉的舊節點)
                           head=next;//(舊頭結點移動到下一個須要反轉的節點)
                          }
                          return new_head;
                        
            
    
      }

    };svg

在這裏插入圖片描述
這個比較簡單,由於是直接把整個鏈表反轉,若是是把當中的某一段反轉呢?spa

升級篇

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

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

示例:xml

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

/**
 * 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 list_len=n-m+1;
        ListNode *result=head;
        ListNode*pre_head=NULL;
        while(--m){
            pre_head=head;
            head=head->next;
        }
        ListNode*N_L_last=head;
        ListNode*new_head=NULL;
        while(head&&list_len)
        {
            ListNode*next=head->next;
            head->next=new_head;
            new_head=head;
            head=next;     
            list_len--;
        }
              N_L_last->next=head;
        if(pre_head)
            pre_head->next=new_head;
        else
            result=new_head;
        return result;
        
        
        
        
    }
};

分析:從m到n,m可能爲1(從頭開始),n也可能爲鏈表長度(到最後)。

一,只須要注意四個關鍵節點(m-1, m , n , n+1 )其中m-1與n+1可能爲不存在的節點。
二,分爲兩部份處理問題(兩邊銜接處)
1),若是m=0,則 :result=new_head(直接爲反轉鏈表的首元節點)(pre_head此時 爲空,沒有與new _head創建關係)
若是m!=0, 則 :pre_head=new_head;(將m-1的節點與反轉後節點鏈接)
2)若是n!=表長,反轉後的最後一個節點(N_L_last)與n+1節點鏈接,而此時正好head指向該節點。
若是n=表長,反轉後的最後一個節點(N_L_last)的next應該爲空,而此時head也爲空,就不須要額外處理了。
三 ,最後返回處理完的頭結點。圖片

在這裏插入圖片描述

代碼不全,如須查看完整代碼,請登入力扣,查看完整版(題號已給出)
做者水平很菜,且是第一次寫,但願看完了別傷身體。leetcode

本文分享 CSDN - 希境。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索