1. 程式人生 > >線性結構:單向連結串列的逆轉

線性結構:單向連結串列的逆轉

逆轉單向連結串列的意思就是,給定你一個單向連結串列,和一個整數NN為要逆轉的結點數,要求你把連結串列從頭結點到第N個結點給逆轉過來。

意思是這樣的,如下圖所示:

給出一個單向連結串列,和給定整數N=4,也就是要求把該連結串列從頭結點(Head->Next)開始到第四個結點,把他們逆轉過來,像下面逆轉後頭結點由1變成了4,然後1後來連結5

那麼如何去實現這樣的逆轉連結串列?既然要改變結點的序列,我們自然而然想到要用一些指標來指向儲存這些結點。這裡把一個單向連結串列逆轉另外用到三個指標。一個New,一個Old,和一個Tag

New指標用來指向已經逆轉好的新的連結串列的頭結點的位置,一開始的時候

New可以先讓它指向連結串列的頭結點。第二個指標Old我們用來指向沒有逆轉完的,舊的連結串列的頭結點,因為我們是把結點一個一個的逆轉,所以Old明顯是跟在New後面的,所以一開始可以讓Old指向New的下一個結點。至於為什麼還要第三個指標Tag,這是一個標記,我們看

當我們把2這個結點的Next逆轉指向1後,2後的連結串列就找不回來了,因為你把2逆轉後,就沒有指標指向3了,這樣3後面的連結串列就都丟掉了。所以第三個指標Tag是用來儲存逆轉過程中Old後的結點,為了在Old逆轉後,開始下一個結點的逆轉時還能找回Old的下一個結點進行逆轉。

三個指標設定好後,接下來就可以開始逆轉連結串列了,首先我們把

2這個結點的Next逆轉過來指向1,然後把三個指標都依次向後移動一個結點,New指向了2結點,New所指的就是完成逆轉的連結串列的頭結點,Old指向3Old指向了當前還沒完成逆轉的連結串列的頭結點,Tag指向Old的下一個結點。

接下來繼續逆轉,下一步就是把Old所指的未完成逆轉的結點進行逆轉,也就是把3->Next指向2,然後三個指標NewOldTag依次往後移一位。


當逆轉的結點到了第4個結點後(達到使用者輸入的整數N後),也就是要停止了不需要往後逆轉了。這時我們看還要做什麼改動,1這個結點的指向還是指向21這個結點應該指向第N+1個結點才對,也就是逆轉前的第N個結點(逆轉完後的頭結點)的下一個結點,這個結點我們用

Tag儲存了起來,所以這裡要做的下一步是把1這個逆轉完後的尾結點的Next指向Tag,也就是4這個結點。然後連結串列的Head結點此時也要做修改,不是指向1這個結點了,而是指向逆轉完後的頭結點也就是New這個結點。


這樣我們就完成了對單向連結串列的N個結點的逆轉了。接下來我們看下程式碼如何實現:

傳進去的兩個引數一個是連結串列的頭結點Head和一個整數N,然定義三個要用的指標NewOldTag指標,和一個cnt做計數,一開始cnt等於1。開始讓New指標指向頭結點也就是Head->NextOld指向New->Next,然後開始做逆轉了。While迴圈裡當cnt<N也就是還沒逆轉完時,迴圈裡先讓Tag指標指向Old->Next也就是儲存Old的下一個結點的位置,然後第113Old->Next等於New也就是做逆轉了,114115行就是逆轉完一個後就把指標向後移。然後cnt++。當完成了N個結點的逆轉後,就要做最後兩步,首先頭結點Head->Next->Next指向Old結點,也就是逆轉前的頭結點,逆轉後變成尾結點了,指向下一個結點。最後還要把連結串列頭指向逆轉完後的頭結點,之間把頭結點return出去賦給Head就可以了。這樣就完成了單向連結串列的逆轉。