對於單鏈表相關的問題,往往是面試的熱點,在此我總結了一些單鏈表相關熱點面試題 一、
比較順序表和煉表的優缺點,說說它們分別在什麼場景下使用?
一、順序表的特點是邏輯上相鄰的資料元素,物理儲存位置也相鄰,並且,順序表的儲存空間需要預分配。 它的優點是:
(1)方法簡單,各種高階語言中都有陣列,容易實現。
(2)不用為表示節點間的邏輯關係而增加額外的儲存開銷。
(3)順序表具有按元素序號隨機訪問的特點。
缺點:(1)在順序表中做插入、刪除操作時,平均移動表中的一半元素,因此對n較大的順序表效率低。
(2)需要預先分配足夠大的儲存空間,估計過大,可能會導致順序表後部大量閒置;預先分配過小,又會造成溢位。
二、在鍊錶中邏輯上相鄰的資料元素,物理儲存位置不一定相鄰,它使用指標實現元素之間的邏輯關係。並且,鍊錶的儲存空間是動態分配的。
鍊錶的最大特點是: 插入、刪除運算方便。
缺點:(1)要占用額外的儲存空間儲存元素之間的關係,儲存密度降低。儲存密度是指乙個節點中資料元素所佔的儲存單元和整個節點所佔的儲存單元之比。
(2)鍊錶不是一種隨機儲存結構,不能隨機訪問元素。
三、順序表與鍊錶的優缺點切好相反,那麼在實踐應用中怎樣選取儲存結構呢?通常有以下幾點考慮: (1)順序表的儲存空間是靜態分配的,在程式執行之前必須明確規定它的儲存規模,也就是說事對「maxsize」要有合適的設定,設定過大會造成儲存空間的浪費,過小造成溢位。因此,當對線性表的長度或儲存規模難以估計時,不宜採用順序表。然而,鍊錶的動態分配則可以克服這個缺點。鍊錶不需要預留儲存空間,也不需要知道表長如何變化,只要記憶體空間尚有空閒,就可以再程式執行時隨時地動態分配空間,不需要時還可以動態**。因此,當線性表的長度變化較大或者難以估計其儲存規模時,宜採用動態鍊錶作為儲存結構。 但在鍊錶中,除資料域外海需要在每個節點上附加指標。如果節點的資料佔據的空間小,則鍊錶的結構性開銷就占去了整個儲存空間的大部分。當順序表被填滿時,則沒有結構開銷。在這種情況下,順序表的空間效率更高。由於設定指標域額外地開銷了一定的儲存空間,從儲存密度的角度來講,鍊錶的儲存密度小於1.因此,當線性表的長度變化不大而且事先容易確定其大小時,為節省儲存空間,則採用順序表作為儲存結構比較適宜。
(2)基於運算的考慮(時間)
順序儲存是一種隨機訪問的結構,而鍊錶則是一種順序訪問結構,因此它們對各種操作有完全不同的演算法和時間複雜度。例如,要查詢線性表中的第i個元素,對於順序表可以直接計算出a(i)的的位址,不用去查詢,其時間複雜度為0(1).而鍊錶必須從煉表頭開始,依次向後查詢,平均需要0(n)的時間。所以,如果經常做的運算是按序號訪問資料元素,顯然順表優於鍊錶。 反之,在順序表中做插入,刪除時平均移動表中一半的元素,當資料元素的資訊量較大而且表比較長時,這一點是不應忽視的;在鍊錶中作插入、刪除,雖然要找插入位置,但操作是比較操作,從這個角度考慮顯然後者優於前者。
(3)基於環境的考慮(語言)
順序表容易實現,任何高階語言中都有陣列型別;鍊錶的操作是基於指標的。相對來講前者簡單些,也使用者考慮的乙個因素。 總之,兩種儲存結構各有長短,選擇哪一種由實際問題中的主要因素決定。通常「較穩定」的線性表,即主要操作是查詢操作的線性表,適於選擇順序儲存;而頻繁做插入刪除運算的(即動態性比較強)的線性表適宜選擇鏈式儲存。
單鏈表相關面試題二(單鏈表的逆置、從頭到尾列印單鏈表)
單鏈表相關的面試題
slist.h void printlistfromtail2head pnode phead 從尾到頭列印單鏈表 void erasenottailnode pnode pos 刪除非尾結點 void insertfront pnode pos,datatype data 無頭單鏈表插入結點 vo...
單鏈表相關的面試題
pragma once include list.h 1.逆序列印單鏈表 template void list printtailtohead node phead 2.刪除無頭節點的單鏈表的非尾節點 template void list delnontailnode node pos 3.無頭單鏈...
鍊錶相關的熱點面試題(一)
先把相關的題目給出來 1.從尾到頭列印單鏈表 2.刪除乙個無頭單鏈表的非尾節點 3.在無頭單鏈表的乙個非頭節點前插入乙個節點 4.逆置 反轉單鏈表 5.單鏈表排序 6.合併兩個有序鍊錶,合併後依然有序 7.查詢單鏈表的中間節點,要求只能遍歷一次鍊錶 先把單鏈表結構給出來 templatet stru...