有關鍊錶的經典面試題 (一)

2021-08-09 10:10:03 字數 2825 閱讀 2571

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

順序表:記憶體中位址連續,優點是隨機訪問比較便捷快速,建立也比較簡單,隨機查詢比較方便,可以直接給出下標,排序也方便                簡單。

缺點: 不夠靈活,刪除增加的工作量叫大,比較麻煩,長度不能實時變化

適用場景:適用於需要大量訪問元素的 而少量增添/刪除元素的程式

缺點: 不支援隨機查詢,查詢元素需要遍歷。

適用場景 : 適用於需要進行大量增添/刪除元素操作 而對訪問元素無要求的程式

2.從尾到頭列印單鏈表

void printtailtohead(node* phead)  //遞迴實現從尾到頭列印單鏈表

printf("%d ", phead->data);

}

3.刪除乙個無頭單鏈表的非尾節點

void erasenontail(node* pos)  //刪除乙個無頭鍊錶的非尾節點

4.在無頭單鏈表的乙個節點前插入乙個節點 

思路一:

先鏈上,再交換其值。但此方法需要額外編寫乙個swap函式,略微複雜。

思路二:

先交換其值,再鏈結。

思路二的**如下:

void insertfront(node* pos, datatype x)  //在無頭單鏈表的乙個節點前插入乙個節點

5.單鏈表實現約瑟夫環 

node* josephus(node* hus, size_t k)  //單鏈表實現約瑟夫環

next = man->next; //為了刪除第k個節點,記錄其下乙個節點

man->data = next->data; //將下一節點的值賦給第k個節點

man->next = next->next; //使值已經改變的第k個節點指向下一節點的下一節點

free(next); //釋放下一節點。即原1 2 3 4 5走3步時,變為1 2 4 4 5,再變為1 2 4 5

}return man; //返回最後只剩乙個節點的man(倖存者)

}

6.逆置/反轉單鏈表(重中之重)

思路一:

將指標逆置,本來1->2->3->4,改為1

void reverselist(node** ppnode)  //逆置反轉

n0 = null;

n1 = *ppnode;

n2 = n1->next;

while (n1) //n1為空時結束

}*ppnode = n0;

}

思路二:

利用逐個頭插到另乙個空節點的方法。

void reverselist(node** ppnode)  //逆置反轉

*ppnode = newhead;

}

7.單鏈表排序(氣泡排序&快速排序) 

氣泡排序:

void sortlist(node* phead)  //氣泡排序(不需要頭,所以不傳二級指標)

node* tail = null;

while (tail != phead)

cur = cur->next;

next = next->next;

}if (exchange == 0)

tail = cur;}}

8.合併兩個有序鍊錶,合併後依然有序 (重中之重)

node* mergelist(node* list1, node* list2)  //兩個有序鍊錶合併後仍為有序鍊錶

if (list2 == null)

//兩者都為空時反正返回為空

if (list1->data < list2->data) //先確定list

else

tail = list;

while (list1&&list2)

else

tail = tail->next; //因為此時新鍊錶已經鏈上了元素,tail後有元素

}if (list1) //如果全部比較後,list1還有元素,直接鏈到tail後

if (list2) //如果全部比較後,list2還有元素,直接鏈到tail後

return list; //list不能動,因為它標識了新鍊錶的頭

}

9.查詢單鏈表的中間節點,要求只能遍歷一次鍊錶

利用快慢指標。

node* findmidnode(node* phead)  //找單鏈表的中間節點

return slow;

}

10.查詢單鏈表的倒數第k個節點,要求只能遍歷一次鍊錶

利用快慢指標。先考慮不足k個節點時,再考慮相差k步和k-1步的差異,差k步在fast為空時結束,差k-1步在fast為尾時結束。

node* findknode(node* phead,size_t k)

fast = fast->next;

}while (fast->next) //快慢指標差k-1步時,fast到尾即可結束

return slow;

}

有關鍊錶的經典面試題(二)

1.判斷單鏈表是否帶環?若帶環,求環的長度?求環的入口點?並計算每個演算法的時間複雜度 空間複雜度。思路 利用快慢指標,快指標一次走兩步,慢指標一次走一步,如快慢指標有相遇點,則一定有環。找到相遇點後,求環長度問題,可以轉換為求頭結點到 相遇點之間的長度問題。求入口點時,讓快指標回到頭結點,兩指標再...

和鍊錶有關面試題

面試中被問鍊錶的題目我就不再多說,直接總結題目。1 將鍊錶逆序 這個問題很早就研究過,但後來一次面試的時候我突然緊張忘了,沒答上來。我不知道大家的解法是什麼,我的解法是遍歷鍊錶是用前插發插入節點,最後的鍊錶就是逆序的。python view plain copy class listnode def...

有關鍊錶的面試題(再續)

今天讓我們來做一些複雜一些的鏈表面試題。1.複雜鍊錶的復刻。typedef struct cn cn cn copy cn pfirst 2.複製prandom。for pnode pfirst pnode null pnode pnode pnext pnext 3.拆鍊錶。for pnode p...