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

2021-07-17 02:12:02 字數 3245 閱讀 5480

一,比較順序表和煉表的優缺點,說說他們分別在什麼場景下使用?

順序表支援隨機訪問,單鏈表不支援

順序表插入和刪除資料效率很低,時間複雜度為o(n)(除尾插尾刪),單鏈表插入刪除效率更高時間複雜度為o(1)

順序表的cpu快取記憶體效率更高,單鏈表cpu告訴快取低

二,刪除乙個無頭單鏈表的非尾節點

三,在乙個無頭單鏈表的乙個非頭節點前插入乙個節點

四,單鏈表實現約瑟夫環

約瑟夫環(

約瑟夫問題

)是乙個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下乙個人又從1開始報數,數到m的那個人又出列;依

此規律重複下去,直到圓桌周圍的人全部出列。

**實現:

#include

using namespace std;

struct node

;class josephus

josephus(int n)// 構造迴圈單鏈表

執行結果:

五,查詢鍊錶的中間節點

要求:只遍歷一次鍊錶

思想:1)設定2個指標,乙個走2步時,另乙個走1步;

2)那麼乙個走到頭時,另乙個走到中間。

**實現:

node *findmid(list *head)//遍歷一次查詢中間節點

}return p1;}

執行結果:

六,查詢單鏈表的倒數第k個結點,要求只能遍歷一遍鍊錶

思想:

比較傳統的做法就是,既然要查詢倒數k個結點,可以先編譯一遍鍊錶,看煉表中有多少個結點n,然後按順序查詢第n-k+1個結點就是要找的結點。但是這種方法需要遍歷鍊錶2遍,並不是很高效。

一種更高效的方法是:用兩個指標,乙個指標先走k-1步,然後第二個指標也開始跟著一起走。當第乙個指標到鍊錶尾部的時候,第二個指標指向的就是鍊錶中的導數第k個結點。

如查詢倒數第3個結點:

**實現:

node *findreversedk(list *head,int k)

return p2;

}node *p1 = *head;

node *p2 = *head;

while (k - 1)

while (p1->next != null)

return p2;}

執行結果:

七,判斷鍊錶是否帶環,若帶環,求環的長度,和入口。

設定兩個指標(fast, slow),初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇(fast如果為null,則為無環鏈表)。

**實現:

bool i***itloop(list *head)//是否帶環

if (fast == null || fast->next == null)

return false;

return true;}

//找入口結點

**實現:

//碰撞點p到連線點的距離=頭指標到連線點的距離

node *findentrance(list *head)

if (fast == null || fast->next == null)

return null;

slow = *head;

while (fast != slow)

return fast;

}求環的長度

**實現:

//記錄下會面的點meet,slow、fast從該點開始,

//再次碰撞所走過的運算元就是環的長度d

int getpathdistance(list *head)

if (fast == null || fast->next == null)

return 0;

node *meet = fast;

slow = slow->next;

fast = fast->next->next;

int distance = 0;

while (slow != fast)

return distance + 1;

}求整個帶環鍊錶的總長度

總長度=環的長度+頭節點到入口的長度

**實現:

//求總長度

int getallpathlen(list *head)

d2 = getpathdistance(head);

d = d1 + d2;

return d;}

主函式:

int main()

執行結果:

鍊錶的相關筆試面試題

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

面試題 順序表(陣列)和鍊錶的區別和聯絡

順序表 陣列 缺點 頭部或者中間插入刪除資料,需要挪動資料,時間複雜度是o n 空間不夠,需要增容,增容有一些消耗,其次一般增容是2倍,那麼就可能存在一定的空間浪費。優點 相對而言空間利用率更高,不需要額外的空間,占用空間小,鍊錶需要存指標。物理空間是連續的,第乙個,支援隨機訪問,可以用下標訪問。最...

開心IT面試題 佇列的順序表 鍊錶實現

c 面試題中很大乙個板塊 資料結構,主要包括線性表 棧 佇列 字串 二叉樹等等,今天我們說說佇列。一 概念 佇列是限定性線性表,只允許在表的一端插入元素,而在另一端刪除元素的線性表。允許刪除一端稱為隊頭,允許插入一端稱為隊尾 佇列的特性是先進先出。佇列的儲存方式有兩種 順序儲存結構和鏈式儲存結構。二...