面試 反轉鍊錶

2022-05-07 16:51:13 字數 1755 閱讀 1043

interview

work

jobc++

經典演算法題目 : 反轉單鏈表 reverse list

對於乙個普通的單鏈表,可以定義成結構體形式:

// 定義鍊錶節點

struct

listnode

請寫乙個函式實現單鏈表的翻轉

題目解析

一般來說,單鏈表的反轉有遞迴和非遞迴的方式來進行實現, 此處的反轉實現 參考反轉鍊錶圖示 其中遞迴方式的實現比較難以理解, 進攻參考

遞迴方式

// 遞迴方式

listnode * reverselist_re

(listnode * head)

非遞迴方式

// ref:[鍊錶反轉**講解](

// 非遞迴方式

listnode * reverselist

(listnode *head)

// 返回新的節點值

return new_head;

}// 不返回操作 非遞迴 反轉鍊錶

void

reverselist2

(listnode * &head)

// 復用 head 指標

head = new_head;

}附加內容

測試工程 實現

// 鍊錶操作類的 測試

#include

using

namespace

std;

// 定義鍊錶節點 值和指標

struct

listnode

;// 定義鍊錶的 增 刪 查 改

// crud

// 建立鍊錶 // 根據首指標 建立首指標節點

void

createhead

(listnode *head, int data)

// 在鍊錶尾頭部新增新節點

void

addnode

(listnode * & head,int data)

// 指向新節點 返回新節點

p->next = head;

head = p;

}// 刪除節點

// 查詢節點

// 更新節點值

// 列印list 所有節點值

void

printlist

(listnode *head)

cout

<<"null"

<}// 反轉鍊錶

// ref:[鍊錶反轉**講解](

// 非遞迴方式

listnode * reverselist

(listnode *head)

// 返回新的節點值

return new_head;

}// 不返回操作 非遞迴 反轉鍊錶

void

reverselist2

(listnode * &head)

// 復用 head 指標

head = new_head;

}// 遞迴方式

listnode * reverselist_re

(listnode * head)

// 主函式 測試 demo

#define length 20

intmain

(void)

鍊錶反轉 58面試「留念」

題目 輸入乙個鍊錶的頭結點,反轉該鍊錶,並返回反轉後鍊錶的頭結點。鍊錶結點定義如下 struct listnode 分析 這是一道廣為流傳的微軟面試題。由於這道題能夠很好的反應出程式設計師思維是否嚴密,在微軟之後已經有很多公司在面試時採用了這道題。為了正確地反轉乙個鍊錶,需要調整指標的指向。與指標操...

面試題 反轉鍊錶

定義乙個函式,輸入乙個鍊錶的頭節點,反轉該鍊錶並輸出反轉後鍊錶的頭節點。鍊錶節點定義如下 struct listnode int m nkey listnode m pnext 思路 額,一路遍歷下去,前後指向反過來,最後乙個節點就輸出。o n 的效率也應該是最優的了。答案如下 listnode r...

面試題 反轉鍊錶

面試題 反轉鍊錶 思路 要實現鍊錶反轉,需要調整鍊錶中指標方向,使鍊錶反轉後的頭結點為原鍊錶的尾結點。為了防止結點斷裂,需定義三個指標,分別指向當前遍歷的結點,它的前一結點以及後乙個結點。當然編寫 時要考慮到下列三點 防止程式崩潰 將思路用 實現為 slistnode node phead 當前結點...