面試相關之鍊錶

2021-09-30 13:23:16 字數 1524 閱讀 2835

1.輸入乙個鍊錶的頭結點,從尾到頭列印每個節點的值。

思路:利用棧來實現。

void reverse_printlist(node *head)

while(!nodes.empty())

2.鍊錶中的 倒數第k個節點:輸入乙個節點,輸出該鍊錶的倒數第k個節點思路:(利用快指標慢指標)

兩個指標指向頭節點,快指標先向前走k-1步,然後兩個指標再一起移動,最後快指標到達鍊錶末尾的時候慢指標指向倒數第k個節點。

void findkthtotail(node *head, int k )

return ;

}slow = head;

while(quick ->next)

cout<

data

<

return ;

}

3.給定煉表頭指標 和節點的指標,在o(1)時間內刪除鍊錶的結點

將該節點下乙個節點的位置的值將該節點的值覆蓋,將下乙個節點刪除。

4.鍊錶反**輸入乙個鍊錶的頭節點,輸出反轉後的鍊錶的頭節點。

為了反轉這個單鏈表,我們先讓頭結點的next域指向結點2,再讓結點1的next域指向結點3,最後將結點2的next域指向結點1,就完成了第一次交換,順序就變成了header-結點2-結點1-結點3-結點4-null,然後進行相同的交換將結點3移動到結點2的前面,然後再將結點4移動到結點3的前面就完成了反轉,思路有了,就該寫**了:

//將1,2節點交換,

//head ->next = node2;

//node1 ->next = node2->next;

//node2 ->next = node1;

node *reverse_list(node *head)

return rev_head;

}

5.合併兩個排序鍊錶:輸入兩個遞增排序的鍊錶,合併這兩個鍊錶使新的鍊錶仍然是按遞增排序的。

node *merge(node *head1,node *head2)

else

return merged_head;

}

10.二叉搜尋樹和雙向鍊錶:輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶,不能建立任何新節點,只能調整樹中節點指標的指向。

解法:中序遍歷的過程中,將前驅和後繼連線起來

11.兩個鍊錶的公共節點:輸入兩個鍊錶輸出它們的第乙個公共節點

思路:兩個鍊錶從後到前尋找,找到最後乙個相同的節點就是兩個鍊錶的第乙個公共子節點,使用兩個輔助棧。

tips:該題在逆時針旋轉90度之後程式設計尋找最低公共祖先的問題。

12.圓圈中最後剩下的數字:0,1,…,n-1 這n個數字排成乙個圓圈,從數字0開始每次從這個圓圈裡刪除第m個數字,求出這個圓圈裡剩下的最後乙個數字

鍊錶的相關筆試面試題

1.反轉乙個鍊錶,不能申請新空間 思路 反轉乙個鍊錶,不申請新空間,即將乙個鍊錶通過頭插 頭刪的方法進行替換 反轉前 1 2 3 4 5 null 反轉後 null 5 4 3 2 1 struct listnode reverselist struct listnode head return r...

面試常見演算法之 反轉鍊錶

思路 以單鏈表有4個節點為例,1 2 3 4 反轉就是取2,放到1前面 繼續取3放到2前面,取4放到3前面。注意取是指的next指標指向它,鍊錶的記憶體空間不是連續的,我們要做的就是把next指的物件變一變。用乙個tail指標指向第乙個節點 因為它後面的最後都會跑到它前面 讓這個指標指向的物件始終不...

順序表和煉表的相關熱點面試題

一,比較順序表和煉表的優缺點,說說他們分別在什麼場景下使用?順序表支援隨機訪問,單鏈表不支援 順序表插入和刪除資料效率很低,時間複雜度為o n 除尾插尾刪 單鏈表插入刪除效率更高時間複雜度為o 1 順序表的cpu快取記憶體效率更高,單鏈表cpu告訴快取低 二,刪除乙個無頭單鏈表的非尾節點 三,在乙個...