歡迎關注天善智慧型,我們是專注於商業智慧型bi,人工智慧ai,大資料分析與挖掘領域的垂直社群,學習,問答、求職一站式搞定!1 引言
單鏈表的操作演算法是筆試面試中較為常見的題目。本文將著重介紹平時面試中常見的關於鍊錶的應用題目。
2 輸出單鏈表倒數第 k 個節點
2.1 問題描述
題目:輸入乙個單鏈表,輸出此煉表中的倒數第 k 個節點。(去除頭結點,節點計數從 1 開始)。
2.2 兩次遍曆法
2.2.1 解題思想
(1)遍歷單鏈表,遍歷同時得出鍊錶長度 n 。
(2)再次從頭遍歷,訪問至第 n - k 個節點為所求節點。
2.2.2 **過程
圖 12.2.3 **實現
/*計算鍊錶長度*/
intlistlength(listnode* phead)elseif(null== phead2)elseelseelseelseif(null== phead2)elseif(null==phead2)elseelseelseif(*phead == pdelnode)//刪除的節點是頭節點
deletepdelnode;
pdelnode=null;
*phead =null;
}else//刪除的是尾節點
listnode *pnode = *phead;
while(pnode->next != pdelnode) {
pnode = pnode->next;
pnode->next =null;
deletepdelnode;
pdelnode=null;
7 從尾到頭列印鍊錶
7.1 問題描述
輸入乙個鍊錶,按煉錶值從尾到頭的順序返回乙個 arraylist 。
7.2 解法
初看題目意思就是輸出的時候鍊錶尾部的元素放在前面,鍊錶頭部的元素放在後面。這不就是先進後出,後進先出麼。
什麼資料結構符合這個要求?
棧!
動畫 2
7.2.1 **實現
classsolution{
public:
vector printlistfromtailtohead(listnode* head) {
vector value;
listnode *p=null;
p=head;
stack stk;
while(p!=null){
stk.push(p->val);
p=p->next;
while(!stk.empty()){
value.push_back(stk.top());
stk.pop();
returnvalue;
7.3 解法二
第二種方法也比較容易想到,通過鍊錶的構造,如果將末尾的節點儲存之後,剩餘的煉表處理方式還是不變,所以可以使用遞迴的形式進行處理。
7.3.1 **實現
classsolution{
public:
vector value;
vector printlistfromtailtohead(listnode* head) {
listnode *p=null;
p=head;
if(p!=null){
if(p->next!=null){
printlistfromtailtohead(p->next);
value.push_back(p->val);
returnvalue;
8 反轉鍊錶
8.1 題目描述
反轉乙個單鏈表。
示例:
輸入:1->2->3->4->5->null
輸出:5->4->3->2->1->null
高階:
你可以迭代或遞迴地反轉鍊錶。你能否用兩種方法解決這道題?
8.2 解題思路
設定三個節點pre、cur、next
(1)每次檢視cur節點是否為null,如果是,則結束迴圈,獲得結果
(2)如果cur節點不是為null,則先設定臨時變數next為cur的下乙個節點
(3)讓cur的下乙個節點變成指向pre,而後pre移動cur,cur移動到next
(4)重複(1)(2)(3)
8.3 動畫演示
8.4 **實現
8.4.1 迭代方式
classsolution{
public:
listnode*reverselist(listnode* head){
listnode* pre =null;
listnode* cur = head;
while(cur !=null){
listnode* next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
returnpre;
8.4.2 遞迴的方式處理
classsolution{
public:
listnode*reverselist(listnode* head){
// 遞迴終止條件
if(head ==null|| head->next ==null)
returnhead;
listnode* rhead = reverselist(head->next);
// head->next此刻指向head後面的鍊錶的尾節點
// head->next->next = head把head節點放在了尾部
head->next->next = head;
head->next =null;
returnrhead;
end今日問題:
通過本文的學習,以後遇到有關鍊錶的面試問題我們有哪些思路去解決?
感謝閱讀
推薦閱讀:
1:網際網路公司迷信大全
2:爬一爬那些年你硬碟存過的老師
3:我男朋友是專案經理......
4:2023年python愛好者社群歷史文章合集(作者篇)
5:2023年終精心整理|python愛好者社群歷史文章合集(型別篇)
iOS面試屬性 property看我就夠了!!!
property ivar getter setter 屬性 property 作為 objective c 的一項特性,主要的作用就在於封裝物件中的資料。使用 property 系統會自動生成setter和getter方法 完成屬性定義後,編譯器會自動編寫訪問這些屬性所需的方法,此過程叫做 自動合...
演算法學習(一)面試問題
對一組資料進行排序 可以用快速排序o nlogn 但是只能證明會快排,但忽略了使用環境。1 所以可以和面試官 1 這組資料有什麼樣的特徵,比如是否包含大量重複元素,如果有那麼三路排序更好,如果所有的排序都是獨特的那普通的就好了。很多語言的標準庫都是三路快排 2 是否大部分資料距離他的正確位置很近?是...
決策樹演算法面試問題彙總
自己救自己系列,不然要沒工作了,我太難了。紅色加粗是我見了好多次,感覺經常會考得點。感覺決策樹是很常考的內容,所以一定要注意!1 id3 的構造準則是資訊增益 2 c4.5的構造準則是資訊增益比 3 cart classfication and regression tree,分類與回歸樹 分類問題...