劍指offer 面試題16 反轉鍊錶(兩種方法)

2021-07-04 11:12:17 字數 2801 閱讀 7974

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

在解決問題前,先想好測試用例:

1、功能測試:輸入的鍊錶含有多個結點,鍊錶中只有乙個結點

2、特殊輸入測試:頭結點為 null指標

解決這個問題有兩種方式:

前提:

這兩種方式 是以 頭結點並不是第乙個資料節點 為基準 表示的。

這種方式,頭結點並不儲存鍊錶的結點資料,其資料位只儲存鍊錶結點總數。

在輸出鍊錶時,從頭結點後的第乙個資料結點開始輸出,並不輸出頭結點。

方法:

1、頭插法:將頭結點後的鏈中結點 從前向後乙個個斷開,並依次以頭插法插入在頭結點後,這樣也相當於完成了鍊錶的反轉,鍊錶的頭結點依然是原頭結點。

2、逆轉指標:即書上所闡述的方法。這種方法比較直觀,將每個結點的指向翻轉過來,原來指向後一結點的,現在指向前乙個結點。

對於第二種方法,可以對照下圖來理解:

圖中闡述了一般情況下,即在鍊錶中間,反轉乙個結點的步驟。其他結點反轉的方式相同。

演算法如下:

#include using namespace std;

typedef struct nodelistnode;

/**建立空鍊錶*/

listnode * creat_list()

/**在鍊錶最後插入節點*/

listnode * insert_node_behind(listnode *phead,int pelem)

listnode *temp, *current;

current = phead;

while(null != current->m_pnext)

temp = new listnode;

temp->m_nvalue = pelem;

temp->m_pnext = null;

current->m_pnext = temp;

phead->m_nvalue += 1;

return phead;

}/**遍歷輸出鍊錶*/

void show_list(listnode *phead)

listnode *temp;

temp = phead->m_pnext;

cout << "該 list 為:" ;

while(null != temp)

cout << endl;

}/**方法一:將頭結點後的鍊錶,乙個個斷開,以從前往後的方式,用頭插法依次接在頭結點後*/

listnode * reverse_list_1(listnode *phead)

listnode *temp, *current;

current = phead->m_pnext;

phead->m_pnext = null; /**頭結點和後面的結點斷開*/

while(null != current)

return phead;

}/**方法二,改變指標方向*/

listnode *reverse_list_2(listnode *phead)

listnode *ppre, *pcurr, *pnex;

//listnode *temp = phead;

/**設定三個指標的初始狀態*/

pcurr = phead->m_pnext; /**儲存當前結點*/

pnex = pcurr->m_pnext; /**儲存當前結點的下一結點*/

ppre = null; /**儲存當前結點的前一結點*/

//phead->m_pnext = null;

//phead = null;

while(null != pnex)

pcurr->m_pnext = ppre; /*將最後乙個節點指向它的前一結點,防止鍊錶斷裂*/

/** pnex = ppre; pcurr->m_pnext 和 pnex 雖然指的位置相同,但是並不是同乙個指標,如果這樣寫會連線不起來 */

phead->m_pnext = pcurr; /**將倒序後的結點鍊錶,從新接頭結點後,這樣反轉後的頭結點依然是原來的頭結點,而第乙個資料結點則變成了原來的尾結點*/

return phead;

}int main()

show_list(phead);

reverse_list_1(phead);

show_list(phead);

reverse_list_2(phead);

show_list(phead);

return 0;

}

結果如下:以下是鍊錶多結點情況,對於其他情況的測試(如單個結點,null指標等),可以改變**中的資料,來測試。

/*點滴積累,我的一小步o(∩_∩)o~*/

劍指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 所示的鍊錶中...