算法训练营第五天| 203. 移除链表元素
题目建议 本题最关键是要理解 虚拟头结点的使用技巧这个对链表题目很重要。题目链接https://leetcode.cn/problems/remove-linked-list-elements/视频讲解https://www.bilibili.com/video/BV18B4y1s7R9解题思路1.处理头节点如果头节点的值等于目标值需要将头节点后移直到找到一个不等于目标值的节点作为新头节点。2.遍历链表使用指针current从新头节点开始遍历链表检查每个节点的下一个节点current.next是否等于目标值。3.删除匹配节点如果current.next的值等于目标值将current.next向current.next.next跳过匹配的节点。否则移动current到下一个节点。代码实现示例struct ListNode* removeElements(struct ListNode* head, int val) { // 1. 处理头节点 while (head ! NULL head-val val) { struct ListNode *temp head; head head-next; free(temp); } if (head NULL) return NULL; // 2. 遍历删除中间节点 struct ListNode *current head; while (current-next ! NULL) { if (current-next-val val) { struct ListNode *temp current-next; current-next current-next-next; free(temp); } else { current current-next; } } return head; }过程中遇到的问题1.头节点处理不当导致内存泄漏或空指针访问头节点是链表的起点修改 head 时必须先保存原节点地址再移动指针最后释放否则会出现内存泄漏或释放错误节点。如果 while 循环的条件写反了比如 head-val val head ! NULL 会直接访问空指针的val, 程序崩溃。2.处理完头节点后忘记判断链表是否为空当链表所有节点的值都等于val比如示例3 [7,7,7,7] 头节点循环处理完后head会变成NULL 。此时直接访问 current-next 等价于 NULL-next 会触发空指针访问程序直接崩溃。3.遍历中间节点时移动指针的时机错误假设链表是1→6→6→3删除第一个6后链表变成1→6→3。此时current 是1如果执行current current-next 会直接跳到第二个6导致第二个6永远无法被删除。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2529106.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!