题目
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
由于函数参数只给定要求被删除的节点,所以我们可以这样想:
如何让自己在世界上消失,但又不死? —— 将自己完全变成另一个人,再杀了那个人就行了。
以上摘自leetcode评论区
翻译过来便是:
node这个节点就是需要删除的节点;之前我们可以用head->next->val去判断下一个是否是删除的节点,然后head->next=head->next->next,这题可以用把 node下一节点复制到node,把下一节点跳过!
注意删除的结点不为末尾结点!!!
由此我们可以这样写:
void deleteNode(struct ListNode* node) {
node->val=node->next->val;
struct ListNode *temp;
temp=node->next;
node->next=node->next->next;
free(temp);
}
附上自己测试时用的完整代码
#include<stdio.h>
#include<stdlib.h>
struct ListNode{
int val;
struct ListNode* next;
};
void deleteNode(struct ListNode* node) {
node->val=node->next->val;
struct ListNode *temp;
temp=node->next;
node->next=node->next->next;
free(temp);
}
void Print(struct ListNode *head)
{
while(head)
{
printf("%d ",head->val);
head=head->next;
}
}
struct ListNode* gen()
{
struct ListNode *head,*end,*node;
head=(struct ListNode*)malloc(sizeof(struct ListNode));
end=head;
node=head;
int num;
scanf("%d",&num);
while(num!=-1)
{
node=(struct ListNode*)malloc(sizeof(struct ListNode));
node->val = num;
end->next = node;
end=node;
scanf("%d",&num);
}
end->next = NULL;
return head->next;
}
int main()
{
struct ListNode *head=gen();
deleteNode(head->next);
Print(head);
return 0;
}