双指针版
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param val int整型
* @return ListNode类
*/
struct ListNode* deleteNode(struct ListNode* head, int val )
{
if(head==NULL)
return NULL;
struct ListNode* cur=head->next;
struct ListNode* pre=head;
if(head->val==val)
return head->next;
while(cur!=NULL)
{
if(cur->val==val)
{
pre->next=cur->next;
}
pre=cur;
cur=cur->next;
}
return head;
}
单指针版
struct ListNode* p=head;
while(p->next->next!=NULL&&p->val!=val)
{
p=p->next;
}
if(p->val==val)
{struct ListNode* q=p->next;
p->val=q->val;
p->next=q->next;
free(q);}
else if(p->next->next==NULL&&p->next->val==val)
{
struct ListNode* q=p;
p=p->next;
q->val=p->val;
q->next=NULL;
}
return head;
将要被删除节点的后一个节点的值赋给被删除节点,删除要被删除节点的后一个节点,保留要被删除的节点,使逻辑上删除了要被删除的节点(偷天换日),在倒数第二个节点是要被删除的节点时要分类讨论

京公网安备 11010502036488号