怎么删除链表的一个节点
时间: 2023-05-12 19:07:24 浏览: 77
要删除链表中的一个节点,需要先找到该节点的前一个节点,然后将前一个节点的 next 指针指向该节点的下一个节点,最后释放该节点的内存空间。具体代码实现如下:
```
void deleteNode(ListNode* node) {
ListNode* prev = nullptr;
ListNode* curr = head;
while (curr != node) {
prev = curr;
curr = curr->next;
}
prev->next = curr->next;
delete curr;
}
```
其中,ListNode 是链表节点的结构体,包含一个 val 值和一个 next 指针,指向下一个节点。
相关问题
c语言链表最后一个节点删除
在C语言中,要删除链表的最后一个节点,可以按照以下步骤进行操作:
1. 遍历链表,找到倒数第二个节点。
2. 将倒数第二个节点的next指针指向NULL,即将其指向空地址。
3. 释放最后一个节点的内存空间。
下面是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
struct Node {
int data;
struct Node* next;
};
// 删除链表最后一个节点的函数
void deleteLastNode(struct Node** head) {
// 如果链表为空,直接返回
if (*head == NULL) {
return;
}
// 如果链表只有一个节点,直接删除该节点
if ((*head)->next == NULL) {
free(*head);
*head = NULL;
return;
}
// 找到倒数第二个节点
struct Node* secondLast = *head;
while (secondLast->next->next != NULL) {
secondLast = secondLast->next;
}
// 释放最后一个节点的内存空间
free(secondLast->next);
// 将倒数第二个节点的next指针指向NULL
secondLast->next = NULL;
}
// 打印链表的函数
void printList(struct Node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
int main() {
// 创建链表
struct Node* head = NULL;
struct Node* second = NULL;
struct Node* third = NULL;
head = (struct Node*)malloc(sizeof(struct Node));
second = (struct Node*)malloc(sizeof(struct Node));
third = (struct Node*)malloc(sizeof(struct Node));
head->data = 1;
head->next = second;
second->data = 2;
second->next = third;
third->data = 3;
third->next = NULL;
// 打印原始链表
printf("原始链表:");
printList(head);
// 删除最后一个节点
deleteLastNode(&head);
// 打印删除后的链表
printf("删除最后一个节点后的链表:");
printList(head);
return 0;
}
```
运行以上代码,输出结果为:
```
原始链表:1 2 3
删除最后一个节点后的链表:1 2
```
双向链表删除最后一个节点
双向链表删除最后一个节点的操作如下:
1. 判断链表是否为空,如果为空则无法进行删除操作,直接返回。
2. 判断链表是否只有一个节点,如果是则将头节点和尾节点都指向NULL,释放最后一个节点的内存,然后返回。
3. 如果链表不止一个节点,那么先找到尾节点的前一个节点,即倒数第二个节点,可以通过循环遍历或者直接使用尾节点的prev指针来找到。
4. 将倒数第二个节点的next指针指向NULL,然后释放尾节点的内存即可。
下面是C++代码实现:
```c++
struct ListNode {
int val;
ListNode *prev;
ListNode *next;
ListNode(int x) : val(x), prev(NULL), next(NULL) {}
};
void deleteLastNode(ListNode* &head, ListNode* &tail) {
if (head == NULL) {
return;
}
if (head == tail) {
delete head;
head = NULL;
tail = NULL;
return;
}
ListNode *p = tail->prev;
p->next = NULL;
delete tail;
tail = p;
return;
}
```