不帶頭結點的非循環雙鏈表在刪除節點的時候比價麻煩,因為同時要維護prior和next兩個指針。在處理第一個節點和最後一個節點的時候都要分別考慮,同時也需要考慮節點數量為1的情況。刪除情況分為下面兩類:
(1)刪除pos位置的節點;
(2)判斷x是否在鏈表中,若存在則刪除;
核心代碼如下:
//刪除pos位置的節點
Node *deletePosList(Node *pNode,int pos){
//注意需要單獨考慮第一個節點和最後一個節點
int i = 1;
int size = sizeList(pNode);
Node *pMove;
pMove = pNode;
//鏈表為空
if (pNode == NULL) {
printf("%s函數執行,鏈表為空,刪除節點失敗\n",__FUNCTION__);
return pNode;
}
//鏈表只有一個節點,刪除第一個節點
if (pos == 1 && size == 1) {
free(pNode);
pNode = NULL;
printf("%s函數執行,刪除pos=%d位置的節點成功\n",__FUNCTION__,pos);
return NULL;
}
//鏈表節點大於1,刪除第一個節點
if (pos == 1) {
pNode = pNode->next;
pNode->prior = NULL;
free(pMove);
pMove = NULL;
printf("%s函數執行,刪除pos=%d位置的節點成功\n",__FUNCTION__,pos);
return pNode;
}
while (pMove != NULL) {
if (i == pos && pos != size) {
pMove->prior->next = pMove->next;
pMove->next->prior = pMove->prior;
free(pMove);
pMove->next = NULL;
printf("%s函數執行,刪除pos=%d位置的節點成功\n",__FUNCTION__,pos);
return pNode;
}
if (i == pos && pos == size) {
pMove->prior->next = NULL;
free(pMove);
pMove = NULL;
printf("%s函數執行,刪除pos=%d位置的節點成功\n",__FUNCTION__,pos);
return pNode;
}
i++;
pMove = pMove->next;
}
printf("%s函數執行,刪除pos=%d位置的節點失敗\n",__FUNCTION__,pos);
return pNode;
}
//判斷x是否在鏈表中,存在則刪除之
Node *deleteValueList(Node *pNode,int x){
Node *pMove;
pMove = pNode;
int size = sizeList(pNode);
//原鏈表為空
if (pNode == NULL) {
printf("%s函數執行,原鏈表為空,刪除節點失敗\n",__FUNCTION__);
return NULL;
}
//刪除的是第一個節點,並且鏈表長度為1
if (pNode->element == x && size == 1) {
free(pNode);
pNode = NULL;
printf("%s函數執行,刪除值為%d節點成功\n",__FUNCTION__,x);
return pNode;
}
//單獨考慮刪除第一個節點的情況,且鏈表長度大於1
if (pNode->element == x) {
pNode = pNode->next;
free(pNode->prior);
pNode->prior = NULL;
printf("%s函數執行,刪除值為%d節點成功\n",__FUNCTION__,x);
return pNode;
}
while (pMove != NULL) {
//要刪除的節點不是最後一個
if (pMove->element == x && pMove->next != NULL) {
pMove->prior->next = pMove->next;
pMove->next->prior = pMove->prior;
free(pMove);
pMove = NULL;
printf("%s函數執行,刪除值為%d節點成功\n",__FUNCTION__,x);
return pNode;
}
//要刪除的是最後一個節點
if (pMove->element == x && pMove->next == NULL) {
pMove->prior->next = NULL;
free(pMove);
pMove = NULL;
printf("%s函數執行,刪除值為%d節點成功\n",__FUNCTION__,x);
return pNode;
}
pMove = pMove->next;
}
printf("%s函數執行,刪除值為%d節點失敗\n",__FUNCTION__,x);
return pNode;
}