最近用c++刷LeetCode做一些题目,所以就把自己的想法写出来分享交流,希望各位大佬多多指正!
题目描述:
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
示例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.
说明:
- 链表至少包含两个节点
- 链表中所有节点的值都是唯一的
- 给定的节点为非末尾节点并且一定是链表中的一个有效节点
- 不要从你的函数中返回任何结果
/**
* 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)
{
}
};
在这里给了题目中的结构体的定义,同时我们也看到了传到deleteNode函数里的参数是ListNode* node,是一个指针;然后我们需要做的就是删除这个指针对应的节点。
在这里,我们可以访问到的东西有:node->val(要删除的节点的值);node->next(要删除的节点的指针,指向链表的下一个值);node->next->val(要删除的节点的下一个节点的val);node->next->next(要删除的节点的下一个节点的next指针)。
到这里,我们要做的就非常简单了,假设链表为1->2->3->4,我们传入的要删除的节点是节点2,解题步骤:
1.node->val = node->next->val
这里做的就是,用下一个节点的val来替代了本节点的val,则我们要删除的节点的值不见了,现在还有一个问题就是,我们此刻的链表变成了1->3->3->4,我们最终要得到的是1->3->4。
2.node->next = node->next->next
由于做完第一步之后是1->3->3->4,我们只需要将第二个节点的next指针指向节点4,就可以跳过第三个节点,就变成了1->3->4。
因此我们就做了两件事情,一是用要删除的下一个节点的值覆盖要删除的节点的值,第二就是将要删除的节点的指针指向要删除的节点后面的第二个节点即可。更像是把node变成了node的下一个节点(先是把下一个节点的val赋值给这个节点,后是把下一个节点的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;
}
};
如果有什么理解不对的地方,欢迎大家批评指正,共同讨论学习。