Leetcode 237:删除链表中的节点

题目

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。

现有一个链表 – head = [4,5,1,9],它可以表示为:

4 -> 5 -> 1 -> 9

示例 1:

输入: head = [4,5,1,9], node = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:

输入: head = [4,5,1,9], node = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
说明:

链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。

思考

这一题C++给出的是

/**
  Definition for singly-linked list.
  struct ListNode {
      int val;
      ListNode *next;
      ListNode(int x) : val(x), next(NULL) {}
  };
 */
class Solution {
public:
    void deleteNode(ListNode* node) {
        
    }
};

看函数头我们可以知道,传入的参数是一个指向ListNode结构类型的指针。也就是说传入函数的是node结点(这个结点就是需要删除的结点)那么其实思路非常简单,就是将node结构体中的指针和数值替换成后一个结构体的对应指针、数值,相当于直接让后面的结构体替代了这个“被删除”的结构体。

考虑两种情况
1.node是最后一个结点
2. node后还有结点

解答
class Solution {
public:
	void deleteNode(ListNode* node) 
	{
		if (node == NULL)
			return;
		if (node->next != NULL)
		{
			node->val = node->next->val;
			//node->next这个指针所指向的后一个节点的val值表示为node->next->val
			node->next = node->next->next;
		}
	}
};
总结

看到这题的discuss区,这一题被骂得非常惨,因为这个题目的叙述其实是有问题的。删除结点的意思,应该是删除并且释放该节点的空间,但是这一题只是相当于改变了指针指向的位置,直接跳过了被删除的结点。

这样做似乎没有什么问题,leetcode上也能够直接Accepted,不过实际上,这样很可能导致内存泄漏的问题。

程序中动态分配的存储空间,在程序执行完毕后需要进行释放,没有释放动态分配的存储空间就会造成内存泄漏。为这个结点配置了内存,然而最后所有指向该内存的指针都遗失了,若缺乏语言这样的垃圾回收机制,这样的内存片就无法归还系统。

因此这一题的删除,其实并不是严格意义上的删除,如果真的考虑内存分配的问题,这样写是有一定的危险性的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值