1. 程式人生 > >資料結構:單鏈表(逆序)

資料結構:單鏈表(逆序)

1 .單鏈表的逆序操作是連結串列中的一個重要操作,也是面試中不可缺少的一個環節,幾乎許多涉及到連結串列的面試題中都會提到如何將一個連結串列進行逆序的操作考點;下面採用“迭代迴圈”的方式來實現將一個連結串列進行逆序,

如連結串列中原來的各節點值分別為:

A    B    C    D     E  

逆序後列印為:

E    D    C    B     A
------------------------------------------
------------- Function 連結串列逆序 ------------
------------- ReverseLinkList  -----------
------------------------------------------

/*********    連結串列逆序   *************/
/****** typedef void * LinkList *****/ void Reverse_LinkList(LinkList list) { struct LList *mPtr = (struct LList*)list; struct LinkNode *mPre = NULL; //指向NULL struct LinkNode *mPcur = mPtr->header.next; struct LinkNode *mPtmp =NULL; if (NULL == list) { return
; } while (mPcur != NULL) { mPtmp = mPcur->next; //快取下一個節點 mPcur->next = mPre; mPre = mPcur; mPcur = mPtmp; } mPtr->header.next = mPre; }
 圖(1)  連結串列中各節點值和節點的順序

這裡寫圖片描述
圖(1)

圖(2)連結串列逆序後的效果:
這裡寫圖片描述


圖(2)
實現這個連結串列逆序的思路和過程就是從頭結點的下一個節點(即首節點)開始,依次改變指標的指向;其詳細的流程如下圖:

步驟(1)
這裡寫圖片描述

 /******* 指向NULL *******/
struct LinkNode *mPre = NULL; 
/********* 指向首節點 *****/
struct LinkNode *mPcur = mPtr->header.next;  
/******** 輔助指標,儲存mPtr所指節點的下一個節點 ***********/
struct LinkNode *mPtmp =NULL; 

1.首先讓mPcur指標指向首節點的下一個節點;因為會改變mPcur指標的指向,所以得借用一個輔助指標mPtmp;讓mPtmp指標儲存mPcur指標所指向的下一個節點值;
2.然後改變mPtr的指向,讓其指向指標mPre(為NULL),讓這個節點稱為當前的尾節點;
3.改變mPtr指標的指向,讓其指向mPcur,這樣while每迴圈一次,就讓mPtr向前不斷地移動,直到最終為NULL;
4.每改變一次mPcur的指向,就讓mPcur指向下一個節點;最終mPcur == NULL時,mPtr剛好為最後一個節點;
如下圖:

這裡寫圖片描述