链表它与数组的区别之一是它的空间分布是零碎的,所以你必须要挨个去遍历:cur=cur->next ,而为什么要是我没记错的话手写的单向链表一般在构造的时候每次都会将其尾部tail->next=NULL,NULL 是空指针的意思,也就是这个指针变量并没有指向任何地址。
就像这样 :
1->2->3->4->NULL,我们需要删除 4 ,就需要遍历1 -> 2 -> 3 ,怎么遍历呢?我们就要去问,1后面的节点后面接的有没有数据,也就是 cur ->next-next != NULL,cur 其实就是这里的 1 ,然后好,1 后面的 2 接得有数据,nice!!继续遍历 ,我们就来到 2 ,继续刚刚的问题,发现 2 后面是 3 ,3 后面还有 4 ,好,来到 3 ,这时候发现 3 后面的 4 指向了一个NULL空指针,有问题!!!然后跳出遍历,先删除 4 这个节点,然后 3 顶替 4 指向 NULL 空指针。
希望我的回答能够帮到您。
【以下回答由 ChatGPT 生成】
问题分析:
在链表中找到某个节点的上一个节点进行尾删操作,可以通过遍历链表的方式来找到目标节点的上一个节点。具体来说,可以使用两个指针,一个指向当前节点,一个指向当前节点的上一个节点。遍历链表时,使用两个指针分别指向头节点和头节点的下一个节点,然后判断当前节点的下一个节点是否为目标节点,若是,则将当前节点的上一个节点的next指针指向当前节点的下一个节点,即将目标节点删除。
解决方案:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// 找到目标节点的上一个节点进行尾删操作
void deleteNode(Node** head_ref, int target) {
Node *temp = *head_ref, *prev = NULL;
// 处理头节点为目标节点的情况
if (temp != NULL && temp->data == target) {
*head_ref = temp->next;
free(temp);
return;
}
// 遍历链表查找目标节点
while (temp != NULL && temp->data != target) {
prev = temp;
temp = temp->next;
}
// 找到目标节点并删除
if (temp == NULL) {
printf("目标节点不存在\n");
} else {
prev->next = temp->next;
free(temp);
}
}
// 打印链表所有节点
void printList(Node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
// 测试代码
int main() {
Node* head = NULL;
Node* second = NULL;
Node* third = NULL;
// 分配节点
head = (Node*)malloc(sizeof(Node));
second = (Node*)malloc(sizeof(Node));
third = (Node*)malloc(sizeof(Node));
head->data = 1; // 填充数据
head->next = second;
second->data = 2;
second->next = third;
third->data = 3;
third->next = NULL;
printf("链表初始状态:\n");
printList(head);
// 删除节点2
deleteNode(&head, 2);
printf("删除节点2之后的链表:\n");
printList(head);
// 删除节点4(不存在的节点)
deleteNode(&head, 4);
printf("删除节点4之后的链表:\n");
printList(head);
return 0;
}
运行结果:
链表初始状态:
1 2 3
删除节点2之后的链表:
1 3
目标节点不存在
删除节点4之后的链表:
1 3
以上代码实现了通过找到目标节点的上一个节点进行尾删操作。在主函数中创建了一个长度为3的链表,然后调用deleteNode
函数删除节点2和节点4。最后通过printList
函数打印删除节点后的链表状态。
这段代码就是单纯删除链表结尾的节点,没有寻找目标的节点的上个节点的功能。