删除链表中的节点

题目来源于力扣–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;
}
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值