刪除雙向鏈表中的節(jié)點(diǎn)需要考慮以下幾種情況:
刪除頭節(jié)點(diǎn):如果要?jiǎng)h除的節(jié)點(diǎn)是頭節(jié)點(diǎn),需要將頭節(jié)點(diǎn)指針指向下一個(gè)節(jié)點(diǎn),并釋放原來的頭節(jié)點(diǎn)內(nèi)存。
刪除尾節(jié)點(diǎn):如果要?jiǎng)h除的節(jié)點(diǎn)是尾節(jié)點(diǎn),需要將尾節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)的next指針指向NULL,并釋放原來的尾節(jié)點(diǎn)內(nèi)存。
刪除中間節(jié)點(diǎn):如果要?jiǎng)h除的節(jié)點(diǎn)是中間節(jié)點(diǎn),需要將該節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)的next指針指向該節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),同時(shí)將該節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)的prev指針指向該節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn),并釋放原來的節(jié)點(diǎn)內(nèi)存。
下面是一個(gè)示例代碼,用來刪除雙向鏈表中的某個(gè)節(jié)點(diǎn):
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;
Node* deleteNode(Node* head, Node* node) {
if (head == NULL || node == NULL) {
return head;
}
if (head == node) {
head = node->next;
}
if (node->prev != NULL) {
node->prev->next = node->next;
}
if (node->next != NULL) {
node->next->prev = node->prev;
}
free(node);
return head;
}
int main() {
Node* head = NULL;
Node* node1 = (Node*)malloc(sizeof(Node));
Node* node2 = (Node*)malloc(sizeof(Node));
head = node1;
node1->data = 1;
node1->prev = NULL;
node1->next = node2;
node2->data = 2;
node2->prev = node1;
node2->next = NULL;
head = deleteNode(head, node1);
Node* current = head;
while (current != NULL) {
printf("%d\n", current->data);
current = current->next;
}
return 0;
}
在上面的示例代碼中,deleteNode函數(shù)用來刪除雙向鏈表中的某個(gè)節(jié)點(diǎn),main函數(shù)創(chuàng)建了一個(gè)雙向鏈表并刪除了其中的一個(gè)節(jié)點(diǎn)。