劍指Offer 面試題16 反轉鍊錶

2021-07-13 02:18:37 字數 2068 閱讀 4225

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

分析:我們使用乙個棧,首先將鍊錶中的每乙個結點都儲存到棧中,然後將棧中的結點依次取出,重新構造鍊錶,注意,要保持頭結點不變,也就是說要在原來的鍊錶基礎之上重新構造新的反轉鍊錶!

源**如下:

#include"list.h"

#include#includeusing std::cout;

using std::endl;

using std::stack;

listnode *listreverse1(listnode **phead)

//如果鍊錶中只有乙個結點,也不用反轉,只需返回該鍊錶的頭結點指標即可

if ((*phead)->next == null)

return *phead;

//鍊錶中有多個結點,則要反轉鍊錶

stackstk;

listnode *phead_temp = *phead;

while (phead_temp != null)

*phead = stk.top();

stk.pop();

listnode *temp = *phead;

while (!stk.empty())

temp->next = null;

return *phead;

}void test11()

void test12()

void test13()

int main()

執行結果:

**********測試非空鍊錶的反轉**********

反轉鍊錶之前:1 2 3 4 5 6

反轉鍊錶之後:6 5 4 3 2 1

頭結點為:the value of this node is 6

**********測試只有乙個結點的鍊錶**********

反轉鍊錶之前:1

反轉鍊錶之後:1

頭結點為:the value of this node is 1

**********測試只有空鍊錶**********

鍊錶為空!

請按任意鍵繼續. . .

為了反轉乙個鍊錶,需要調整鍊錶中指標的方向。

官方源**:

#include"list.h"

#include#includelistnode* reverselist(listnode* phead)

return preversedhead;

}// ********************測試**********************

listnode* test(listnode* phead)

// 輸入的鍊錶有多個結點

void test1()

// 輸入的鍊錶只有乙個結點

void test2()

// 輸入空鍊錶

void test3()

int main()

執行結果:

the original list is:

1 2 3 4 5 the reversed list is:

5 4 3 2 1 the original list is:

1 the reversed list is:

1 the original list is:

the list is empty

the reversed list is:

the list is empty

請按任意鍵繼續. . .

注意:方法一是在原始鍊錶的基礎上進行逆轉的,也就是改變了原有的鍊錶;方法二是重新建立了乙個新的鍊錶。

劍指offer 面試題16 反轉鍊錶

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

劍指Offer面試題16 反轉鍊錶

反轉鍊錶 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出翻轉後鍊錶的頭結點。分析 假設h,i,j三個節點。h節點已經指向前面的節點,i節點要指向h節點,這時,i與j中間斷開,因此在將i節點指向 h節點之前,先記下j節點。因此調整時 需要知道當前節點以及當前節點前面乙個節點,以及當前節點後面乙個...

劍指offer面試題16 反轉鍊錶

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