一,比較順序表和煉表的優缺點,說說他們分別在什麼場景下使用?
順序表支援隨機訪問,單鏈表不支援
順序表插入和刪除資料效率很低,時間複雜度為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 面試題中很大乙個板塊 資料結構,主要包括線性表 棧 佇列 字串 二叉樹等等,今天我們說說佇列。一 概念 佇列是限定性線性表,只允許在表的一端插入元素,而在另一端刪除元素的線性表。允許刪除一端稱為隊頭,允許插入一端稱為隊尾 佇列的特性是先進先出。佇列的儲存方式有兩種 順序儲存結構和鏈式儲存結構。二...