目录
题目描述
思路
此题思路与链表中间位置删除类似,但多了些细心和耐心。 主要思路是将要删除节点的前后节点先连接,之后删除中间节点,再进行迭代。
解题方法
创建两个变量,一个指向头节点,一个指向空指针,当节点的数字与val相等时判定为删除,否则迭代。迭代方法是将cur赋值给prev,将cur->next赋值给cur。判定删除时再分当头节点为val时和正常情况(没有头删时可能会触发解引用空指针),头节点为val时为头删,将头节点的下一个节点地址更新为头节点,再删除原头节点;正常情况则是越过要删除的节点,将前后节点连接,再删除中间节点。
代码实现
typedef struct ListNode Node;
struct ListNode* removeElements(struct ListNode* head, int val) {
Node* prev=NULL,*cur=head;
while(cur)
{
if(cur->val==val)
{
if(cur==head)//当头节点的值为val时,是头删
{
head=cur->next;
free(cur);
cur=head;,
}
else//非头节点的删除
{
prev->next=cur->next;//越过cur节点,连接cur前后两个节点
free(cur);
cur=prev->next;//将连接后的prve->next赋值给cur
}
}
else//迭代
{
prev=cur;
cur=cur->next;
}
}
return head;
}