-
标题题目大意
编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,传入函数的唯一参数为 要被删除的节点 。 -
解题思路
看到这个题,是属于较简单的类型的,但是因为是刷leetcode的第一个题目,所以还是看了官方解答。大概的题目意思是写一个函数,删除给定链表中的一个节点。但是给定的函数中传入的参数为ListNode* node
又因为我们无法在链表中得到给定节点的上一个节点,所以我们想到的是把当前要删除的节点的值改为该节点的下一个节点的值,并且改变该节点的next指针为next->next; -
实现代码
解法一:
/**
* 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) {
node ->val = node ->next ->val ;
node ->next = node ->next->next ;
}
};
该解法存在的问题:内存泄漏,也就是说实际上是并没有释放node指针指向的内存节点的内存,只是让该节点换了一层皮衣继续在内存中。
解法二:
/**
* 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) {
*node = *(node->next) ;
}
};
该解法是直接修改指针指向的节点位置。由链表的知识可以知道,node指针和前一个节点的next指向的是同一个内存块,在函数中修改了node指针所指向的内存块,也就是修改了该节点前一个节点next指向的位置。
- 反思
其实对于解法二是存在一些不理解的,好像和函数传形式参数和实际参数有关系,有时间搞清楚。