单链表节点删除问题

单链表的节点删除一种保守的做法是从头遍历一遍,然后找到要删除节点的前一个节点,修改next指针,最后释放delete节点。实际上有些情况下可以在O(1)的时间内删除节点!

如果节点指针被引用,那么删除单链表的节点就只能遍历一遍来删除了,否则我们完全可以优化删除算法!设要删除的节点为p,当节点需要维持相对顺序时,将节点p->next的值拷贝到节点p,然后删除节点p->next,如果节点p位于末尾,则从头遍历删除,虽然这种情况下时间复杂度是O(n),但是平均时间复杂度是O(1)。当节点不需要维持相对顺序时,完全可以将第一个节点的值拷贝到要删除的节点,然后删除第一个节点,这样删除一个节点总是O(1)的时间复杂度!

### PTA 平台单链表节点删除实现 在处理单链表节点删除操作,通常涉及两个主要场景:删除指定位置的节点以及删除具有特定值的第一个匹配节点。对于这两种情况,都需要遍历链表并调整指针。 #### 删除指定位置的节点 为了从给定的位置`pos`处移除一个节点,程序需要先找到该位置之前的节点,并将其`next`字段更新为待删节点之后的那个节点。如果要删除的是头结点,则需特别注意处理这种情况[^3]: ```c // 假设 head 是指向链表头部的指针, pos 表示目标位置 (基于0索引) if(pos == 0){ struct ListNode* toBeDeleted = head; head = head->next; free(toBeDeleted); } else { int index = 0; struct ListNode *current = head,*prev=NULL; while(current != NULL && index < pos){ prev=current; current=current->next; ++index; } if(index==pos&&current!=NULL){ // 找到了对应位置 prev->next=current->next; free(current); } } ``` #### 删除第一个匹配特定值的节点 此过程同样依赖于遍历来定位到含有目标数值的首个实例。一旦发现这样的节点,就按照上述逻辑修改前后节点之间的链接关系: ```c struct ListNode* removeFirstMatch(struct ListNode* head,int targetValue){ if(head==NULL)return NULL; if(head->val==targetValue){ struct ListNode* oldHead=head; head=head->next; free(oldHead); return head; }else{ struct ListNode *currNode=head,*prevNode=NULL; while(currNode!=NULL && currNode->val!=targetValue){ prevNode=currNode; currNode=currNode->next; } if(currNode!=NULL){// 如果找到了相等元素 prevNode->next=currNode->next; free(currNode); } return head; } } ``` 以上两种方式均适用于解决PTA平台上有关单链表节点删除的任务需求。值得注意的是,在实际编码过程中应当考虑边界条件,比如试图访问越界位置或者尝试在一个空链表上调用这些函数等情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值