题目来源于力扣–https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnarn7/
题目指出,不知道头结点的位置,只知道给出的删除节点,通过这个我们也可以知道要删除节点的下一个节点,所以我们可以这样做,假设要删除节点指针为p,下一个节点指针为q
1、p->data = q->data(q指向节点的值赋值给p指向节点的值)。
2、p->next = q->next(p的下一个节点指向q的下一个节点)。
3、free掉q。
4、q置空,防止出现野指针。
其实我们并没有删除真正要删除的节点,因为我们不知道前一个节点在哪里,所以我们把p后一个节点q的值copy了一份,并让p指向的下一个节点指向q指向的下一个节点,然后删除掉q就完成了!
借助一张图
main函数代码
#include<stdio.h>
#include<stdlib.h>
void deleteNode(struct ListNode* node);
// 结构体
struct ListNode {
int val;
struct ListNode *next;
};
int main(){
// 动态申请四个空间
struct ListNode *p = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *q = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *r = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode));
// 初始化节点的值
p->val = 4;
q->val = 5;
r->val = 1;
s->val = 9;
// 将链表的节点连接起来,四个节点
p->next = q;
q->next = r;
r->next = s;
s->next = NULL;
// 调用删除指定节点函数,删除第二个节点
deleteNode(q);
printf("删除之后节点的值:\n");
while(p!=NULL){
printf("%d ",p->val);
p = p->next;
}
return 0;
}
删除节点代码实现
void deleteNode(struct ListNode* node) {
//声明一个临时指针
struct ListNode *temp;
// 临时指针指向要删除节点的下一个节点
temp = node->next;
// 将临时指针指向节点的值赋值给要删除的节点
node->val = temp->val;
// 要删除节点指向的下一个节点为指向临时指针指向的下一个节点
node->next = temp->next;
// 释放临时指针指向的节点
free(temp);
// 指针赋空
temp = NULL;
}