iis网站下载,小程序开通,做网站维护承包合同,公司做网站费用入什么科目大家好#xff0c;欢迎来到我的博客#xff0c;此题是关于链表oj的第一题#xff0c;此后还会陆续更新博客#xff0c;如有错误#xff0c;欢迎大家指正。
来源:https://leetcode.cn/problems/remove-linked-list-elements/description/
题目: 方法一:定义prev和cur指针… 大家好欢迎来到我的博客此题是关于链表oj的第一题此后还会陆续更新博客如有错误欢迎大家指正。
来源:https://leetcode.cn/problems/remove-linked-list-elements/description/
题目: 方法一:定义prev和cur指针(双指针)
分析: 使用两个指针prev和cur来遍历链表。prev指针指向当前节点的前一个节点而cur指针指向当前节点。
在 while 循环中首先检查当前节点的值是否等于val。如果相等则需要移除该节点。
如果当前节点的值不等于val则将prev更新为cur, cur 更新为下一个节点以继续遍历链表。
思路一prev不为NULL
如果 prev 不为 NULL表示当前节点不是头节点则将 prev-next 指向当前节点的下一个节点然后释放当前节点 cur 的内存并更新cur为 prev-next 即下一个要检查的节点。 思路二: prev 为 NULL
如果 prev 为 NULL表示当前节点是头节点则将 cur 更新为头节点的下一个节点释放头节点 head 的内存并更新 head 为新的头节点 cur。 最后返回更新后的链表头指针 head
该代码的目的是移除链表中所有值为 val 的节点同时释放相应的内存。
代码实现:
struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* prev NULL, * cur head;while (cur){if (cur-val val){if (prev){prev-next cur-next;free(cur);cur prev-next;}else{cur head-next;free(head);//会把指针域next给free掉因为它也是结构体的成员head cur;}}else{prev cur;cur cur-next;}}return head;
}
执行: 方法二:链表尾插
大致思路:
移除链表中所有值为val的节点并使用尾插法构建一个新的链表返回新链表的头指针。原始链表中不满足条件的节点会被保留而满足条件的节点会被移除并释放内存。
尾插的思路:
函数使用三个指针cur、newhead 和 tail 来遍历和构建新的链表。
在 while 循环中首先检查当前节点的值是否等于 val 。如果不等于 val 则执行尾插操作将该节点添加到新链表中。
顺序:
如果 tail 为 NULL表示当前节点是新链表的第一个节点。将newhead和 tail 都指向当前节点cur接着将 cur 更新为下一个节点并将 tail-next 设置为 NULL确保新链表断开此时 tail 不为 NULL表示当前节点需要添加到新链表的尾部。将 tail-next 指向当前节点 cur 然后更新 tail 为 tail-next,新链表链接起来实现尾插。接着持续2的操作
如果当前节点的值等于 val 则需要移除该节点。将 cur 更新为下一个节点并释放当前节点 del 的内存。
最后返回新链表的头指针 newhead
画图: 代码实现:
//尾插
struct ListNode* removeElements(struct ListNode* head,int val)
{struct ListNode*curhead;struct ListNode *newheadNULL,*tailNULL;while(cur)
{if(cur-val!val){if(tailNULL){newheadtailcur;}else{tail-nextcur;tailtail-next;}curcur-next;// 这两条语句不可以调换顺序否则tail-nextnulltail-nextNULL;//curcur-next这样写的话会尾插失败}else{struct ListNode*delcur;curcur-next;free(del);//会把指针域next给free掉因为它也是结构体的成员}}return newhead;}代码执行: 好了博客就分享到这里了感谢你的来访