程序员怎么删除链表

时间:2025-01-26 15:00:32 单机游戏

在链表中删除节点通常涉及以下步骤:

找到要删除的节点

如果要删除的是头节点,直接将头指针指向下一个节点。

如果要删除的不是头节点,需要遍历链表,找到要删除节点的前一个节点(prev)和要删除的节点(current)。

更新指针

将prev节点的next指针指向current节点的下一个节点(current->next)。

将current节点的next指针置为NULL,以防止悬空指针。

释放内存

释放current节点的内存空间。

```c

include

include

// 定义链表节点结构体

typedef struct Node {

int data;

struct Node *next;

} Node;

// 删除链表节点

void deleteNode(Node head, int key) {

// 创建指针用于指向要删除的节点

Node* current = *head;

Node* prev = NULL;

// 如果链表为空,直接返回

if (current == NULL) {

printf("链表为空,无法删除节点。\n");

return;

}

// 如果要删除的节点是头节点

if (current->data == key) {

*head = current->next;

free(current);

return;

}

// 如果要删除的节点不是头节点

while (current != NULL) {

if (current->data == key) {

prev->next = current->next;

free(current);

return;

}

prev = current;

current = current->next;

}

// 如果没有找到要删除的节点

printf("未找到值为 %d 的节点。\n", key);

}

// 示例:创建链表并删除节点

int main() {

Node* head = NULL;

Node* node1 = (Node*)malloc(sizeof(Node));

node1->data = 1;

node1->next = NULL;

Node* node2 = (Node*)malloc(sizeof(Node));

node2->data = 2;

node2->next = NULL;

Node* node3 = (Node*)malloc(sizeof(Node));

node3->data = 3;

node3->next = NULL;

head = node1;

node1->next = node2;

node2->next = node3;

printf("原始链表:\n");

printList(head);

deleteNode(&head, 2);

printf("删除节点2后的链表:\n");

printList(head);

return 0;

}

// 打印链表

void printList(Node* head) {

Node* current = head;

while (current != NULL) {

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

current = current->next;

}

printf("NULL\n");

}

```

建议

在删除链表节点时,务必检查链表是否为空,以避免空指针异常。

删除节点前,确保找到要删除节点的前一个节点,以便正确更新链表结构。

释放节点内存时,使用`free`函数,并确保不会造成内存泄漏。