劍指Offer面試題16 反轉鍊錶

2021-06-25 12:39:49 字數 2296 閱讀 4719

/*

反轉鍊錶:

定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出翻轉後鍊錶的頭結點。

分析:假設h,i,j三個節點。h節點已經指向前面的節點,i節點要指向h節點,這時,i與j中間斷開,因此在將i節點指向

h節點之前,先記下j節點。

因此調整時:需要知道當前節點以及當前節點前面乙個節點,以及當前節點後面乙個節點。

因此,我們需要設定三個節點。

剛開始將頭結點賦給當前節點,並設定對頭結點的特殊處理

如果到達尾結點,要對尾結點做特殊處理

輸入:輸入可能包含多個測試樣例,輸入以eof結束。

對於每個測試案例,輸入的第一行為乙個整數n(0<=n<=1000):代表將要輸入的鍊錶的個數。

輸入的第二行包含n個整數t(0<=t<=1000000):代表鍊錶元素。

輸出:對應每個測試案例,

以此輸出鍊錶反轉後的元素,如沒有元素則輸出null。

樣例輸入:

51 2 3 4 5

0樣例輸出:

5 4 3 2 1

null

*//*

關鍵:1 if(phead == null || *phead == null)//如果指向鍊錶指標的指標為空或者為空鍊錶,均返回false

2 node* pcurnode,*pfrontnode = null,*pnextnode,*preversehead;//初始時要設定上乙個節點為空,這是因為原來的首節點的指向要為空,這樣才能變成最後乙個

3 while(pcurnode != null)//一旦為空,表示到結尾了,該結束了

pcurnode->_next = pfrontnode;//讓當前節點指向前乙個節點

pfrontnode = pcurnode;//繼續向下遍歷

pcurnode = pnextnode;

4 if(phead == null || *phead == null)//有關鍊錶的任何操作需要判定指標是否為空

*/#include const int maxsize = 1001;

typedef struct node

node;

void buildlist(node** phead,int* parr,int n)//採用尾插法

node* pcurnode;

for(int i = 0 ; i < n ; i++)

else//建立頭結點}}

void freelist(node** phead)//刪除鍊錶

node* pnode;

while((*phead) != null)

}node* reverselist(node** phead)

bool isfirst = true;

node* pcurnode,*pfrontnode = null,*pnextnode,*preversehead;//初始時要設定上乙個節點為空,這是因為原來的首節點的指向要為空,這樣才能變成最後乙個

pcurnode = *phead;//就從頭結點開始迴圈,避免後面節點的判斷

while(pcurnode != null)//一旦為空,表示到結尾了,該結束了

pcurnode->_next = pfrontnode;//讓當前節點指向前乙個節點

pfrontnode = pcurnode;//繼續向下遍歷

pcurnode = pnextnode;

}return preversehead;

}void printlist(node** phead)

node* pnode = *phead;

bool isfirst = true;

while(pnode)

else

pnode = pnode->_next;

}printf("\n");

}void process()

int iarr[maxsize];

for(int i = 0 ; i < n ; i++)

node* head = new node();

node** phead = &head;//這樣做的原因是:好讓頭指標能夠修改,若直接傳遞node*作為頭節點,則修改後會作為區域性變數最後消失

buildlist(phead,iarr,n);//用尾插法建立鍊錶

node* pres = reverselist(phead);

if(pres)

else

freelist(&pres);}}

int main(int argc,char* argv)

劍指offer 面試題16 反轉鍊錶

題目描述 輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。hint 請務必使用鍊錶 輸入 輸入可能包含多個測試樣例,輸入以eof結束。對於每個測試案例,輸入的第一行為乙個整數n 0 n 1000 代表將要輸入的鍊錶的個數。輸入的第二行包含n個整數t 0 t 1000000 代表鍊錶元素。輸出 對應每個...

劍指offer面試題16 反轉鍊錶

題目描述 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。鍊錶節點定義如下 public class listnode 示意圖 分析 為了正確反轉乙個鍊錶,需要調整鍊錶中指標的方向,為了將調整指標這個複雜的過程分析清楚,我們可以借助圖形來分析,如上圖所示,在 a 所示的鍊錶中...

劍指Offer 面試題16 反轉鍊錶

定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。分析 我們使用乙個棧,首先將鍊錶中的每乙個結點都儲存到棧中,然後將棧中的結點依次取出,重新構造鍊錶,注意,要保持頭結點不變,也就是說要在原來的鍊錶基礎之上重新構造新的反轉鍊錶!源 如下 include list.h includ...