请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 – 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.
说明:
链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。
思路:
乍一看很简单对不对,和707题相比,完全省去了很多代码,但是注意,这个地方没有给你链表的头节点,而是只给了需要删除的结点node(注意是结点,不是值),所以这就意味着你不能通过修改node前一个结点的next指针来完成。
所以需要一个很巧妙的方法,你可以把node的值修改为node下一个结点的值,这样就相当于已经删除了目标结点的值,但是结点还没有删除,这时,只需要修改node的next指针,跳过node的下一个结点即可
图片以及思路来源:力扣官方题解
https://leetcode-cn.com/problems/delete-node-in-a-linked-list/solution/shan-chu-lian-biao-zhong-de-jie-dian-by-leetcode/
#include<iostream>
#include<cstdlib>
using namespace std;
typedef struct ListNode
{
int val;
ListNode *next;
} ListNode,*PtrToNode;
void Print(PtrToNode N)
{
PtrToNode p = N;
while(p!=NULL)
{
printf("%d ",p->val);
p = p->next;
}
printf("\n");
return;
}
PtrToNode Insert(PtrToNode N,int e)
{
PtrToNode p = (PtrToNode)malloc(sizeof(ListNode));
p->val = e;
p->next = NULL;
if(N == NULL)
{
N = p;
}
else
{
PtrToNode q = N;
while(q->next != NULL)
{
q = q->next;
}
q->next = p;
}
return N;
}
class Solution
{
public:
void deleteNode(ListNode* node)
{
node->val = node->next->val;
node->next = node->next->next;
}
};
int main()
{
Solution s;
PtrToNode N,M;
N = NULL;
N = Insert(N,1);
N = Insert(N,2);
N = Insert(N,3);
N = Insert(N,4);
N = Insert(N,5);
N = Insert(N,6);
Print(N);
s.deleteNode(N->next);
Print(N);
return 0;
}