1 鏈表中前驅的重要性。
在鏈表中,刪除一個結點而不導致鏈表斷裂,一個必要條件就是這個結點的前驅和後繼能夠相連。
然而不是每種數據結構上都保存有前驅指針。
在這種情況下我們可以使用的一個小技巧就是在起點之前再增加一個結點(比如有些鏈表中的head)。然後把head與head->next一起推進,當head->next正好到達指定結點時,我們想要找的前驅也就找到了。
2 鏈表中臨時指針的重要性。
(1) 在很多時候,數據結構中都有一個關鍵的起點指針,比如鏈表中的first(不含有頭結點)、head(含有頭結點)、二叉樹中的root。我們的遍歷操作都要從這些起點指針開始動手,這就要求我們必須要慎重對待。很多時候我們可以使用一些臨時指針來作爲開頭,避免修改關鍵性數據。
(2) 當我們的遍歷達到一定程度的時候,我們必須要保存一個結點的前驅,或者後繼的時候,也就有必要了。
3 鏈表中for循環、while循環中止隱藏的陷阱。
/*注意for循環中止的時候,p指向第k個結點已經成立了。*/
for (int i=1; i<k; i++) p=p->link;
for (int i=1; i<k-1; i++) q=q->link; /*循環結束時,q指向誰?指向要刪除的結點的前驅。有趣的是,如果要刪除頭結點,則這個語句不會執行*/
4 注意刪除指針時的錯誤。
delete [] elements;//釋放整個elements數組
delete elements; //只是釋放element數組的頭一個元素