题目
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 – head = [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.
说明:
链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。
分析
我刚开始理解错了题目,以为给你一个链表和一个节点,然后删除链表中的那个节点,然后我写了一下代码(下方有),leetcode上运行明显不成功,因为题目只给你了一个节点,下面有正确代码。
错误代码(若题目给了链表头节点就正确了)
题目若给了head节点,该代码可以删除任何链表节点,包括链表尾节点。
class Solution {
public:
void deleteNode(ListNode* node) {
ListNode*temp=head;
ListNode*before;
if(head->val==node->val)//考虑头节点为node节点的情况
{
head=head->next;
return;
}
while(temp)//因为要保证before的正确性,头节点不能为node节点,这是剩余情况(node节点为末尾节点的情况也包含)
{
if(temp->val==node->val)
{
before->next=node->next;
return;
}
before=temp;
temp=temp->next;
}
}
};
正确代码:
class Solution {
public:
void deleteNode(ListNode* node) {
node->val=node->next->val;//将给定节点(node)的后一个节点的值给node
node->next=node->next->next;//node指向node的下下个节点
}
};