双指针版
/** * 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;
将要被删除节点的后一个节点的值赋给被删除节点,删除要被删除节点的后一个节点,保留要被删除的节点,使逻辑上删除了要被删除的节点(偷天换日),在倒数第二个节点是要被删除的节点时要分类讨论