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...