線性結構:單向連結串列的逆轉
逆轉單向連結串列的意思就是,給定你一個單向連結串列,和一個整數N,N為要逆轉的結點數,要求你把連結串列從頭結點到第N個結點給逆轉過來。
意思是這樣的,如下圖所示:
給出一個單向連結串列,和給定整數N=4,也就是要求把該連結串列從頭結點(Head->Next)開始到第四個結點,把他們逆轉過來,像下面逆轉後頭結點由1變成了4,然後1後來連結5。
那麼如何去實現這樣的逆轉連結串列?既然要改變結點的序列,我們自然而然想到要用一些指標來指向儲存這些結點。這裡把一個單向連結串列逆轉另外用到三個指標。一個New,一個Old,和一個Tag。
New指標用來指向已經逆轉好的新的連結串列的頭結點的位置,一開始的時候
當我們把2這個結點的Next逆轉指向1後,2後的連結串列就找不回來了,因為你把2逆轉後,就沒有指標指向3了,這樣3後面的連結串列就都丟掉了。所以第三個指標Tag是用來儲存逆轉過程中Old後的結點,為了在Old逆轉後,開始下一個結點的逆轉時還能找回Old的下一個結點進行逆轉。
三個指標設定好後,接下來就可以開始逆轉連結串列了,首先我們把
接下來繼續逆轉,下一步就是把Old所指的未完成逆轉的結點進行逆轉,也就是把3->Next指向2,然後三個指標New、Old、Tag依次往後移一位。
當逆轉的結點到了第4個結點後(達到使用者輸入的整數N後),也就是要停止了不需要往後逆轉了。這時我們看還要做什麼改動,1這個結點的指向還是指向2,1這個結點應該指向第N+1個結點才對,也就是逆轉前的第N個結點(逆轉完後的頭結點)的下一個結點,這個結點我們用
這樣我們就完成了對單向連結串列的N個結點的逆轉了。接下來我們看下程式碼如何實現:
傳進去的兩個引數一個是連結串列的頭結點Head和一個整數N,然定義三個要用的指標New、Old和Tag指標,和一個cnt做計數,一開始cnt等於1。開始讓New指標指向頭結點也就是Head->Next,Old指向New->Next,然後開始做逆轉了。While迴圈裡當cnt<N也就是還沒逆轉完時,迴圈裡先讓Tag指標指向Old->Next也就是儲存Old的下一個結點的位置,然後第113Old->Next等於New也就是做逆轉了,114到115行就是逆轉完一個後就把指標向後移。然後cnt++。當完成了N個結點的逆轉後,就要做最後兩步,首先頭結點Head->Next->Next指向Old結點,也就是逆轉前的頭結點,逆轉後變成尾結點了,指向下一個結點。最後還要把連結串列頭指向逆轉完後的頭結點,之間把頭結點return出去賦給Head就可以了。這樣就完成了單向連結串列的逆轉。