【数据结构OJ题】移除链表元素

news/2024/11/6 12:43:53/

移除链表元素


原题链接:力扣 

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点 。

 方法一:原地删除节点

思路:

 首先,定义两个指针:prve和cur。它们会在遍历链表的过程中分别指向当前节点的前一个节点和当前节点。初始情况下,prve指向NULL(因为当前节点是头结点),cur指向head。

然后,我们使用while循环遍历链表,直到cur指向NULL(也就是遍历完整个链表)。在每个节点处,我们判断当前节点(cur)的值是否等于val。如果是,我们就需要将该节点从链表中移除。

如果当前节点cur是头结点,那么我们需要特殊处理,因为头结点没有前一个节点。此时,我们修改head指向cur的下一个节点,然后释放cur所指向的内存空间,使得cur指向新的头结点(即head),继续遍历整个链表。

如果当前节点cur不是头结点,那么我们需要将cur从链表中移除。此时,我们将prve的next指针指向cur的下一个节点,然后释放cur所指向的内存空间,使得cur指向prve的下一个节点(也就是新的当前节点),继续遍历整个链表。

如果当前节点cur的值不等于val,我们就只需要更新prve和cur的指向,使得它们分别指向当前节点的前一个节点和当前节点的下一个节点,然后继续遍历整个链表。

具体过程图解:

 需要注意头节点的值是val的情况

代码:

struct ListNode* removeElements(struct ListNode* head, int val)
{//定义两个指针:prve和curstruct ListNode* prve = NULL;struct ListNode* cur = head;while (cur != NULL){//判断当前节点(cur)的值是否等于val。如果是,我们就需要将该节点从链表中移除if (cur->val == val){//如果当前节点cur是头结点,那么我们需要特殊处理if (cur == head){head = cur->next;free(cur);cur = head;}else{prve->next = cur->next;free(cur);cur = prve->next;}}//如果当前节点cur的值不等于val,我们就只需要更新prve和cur的指向else{prve = cur;cur = cur->next;}}return head;
}

方法二:遍历链表,把不是val的节点拿出来进行尾插到新链表

下面有两种方式来实现;

不带哨兵卫头节点:

struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* tail = NULL;struct ListNode* cur = head;head = NULL;while (cur){if (cur->val != val){if (tail == NULL){head = tail = cur;}else{tail->next = cur;tail = cur;}cur = cur->next;}else{struct ListNode* del = cur;cur = cur->next;free(del);}}if (head){tail->next = NULL;}return head;
}

带哨兵卫头节点:

struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* tail = NULL;struct ListNode* cur = head;head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));head->next = NULL;while (cur){if (cur->val != val){tail->next = cur;tail = cur;cur = cur->next;}else{struct ListNode* del = cur;cur = cur->next;free(del);}}if (head){tail->next = NULL;}          struct ListNode* del = head;head = head->next;free(del);return head;
}

带哨兵卫头节点和不带哨兵卫头节点的方法类似。


http://www.ppmy.cn/news/601591.html

相关文章

vue3.0 + elementUI 弹窗二次封装

使用组件&#xff1a; <page-dialog v-model:dialogShow"gisLock" footerCustom>{{gisLock}}</page-dialog><page-dialog v-model:dialogShow"gisLock">{{gisLock}}<template #dialog-button><el-button type"primary&quo…

对新手来说,一句 Hello World 能有多少坑?

入门教程、案例源码、学习资料、读者群 请访问&#xff1a;python666.cn 大家好&#xff0c;欢迎来到 Crossin的编程教室 &#xff01; 在编程届&#xff0c;有一个不成文的习惯&#xff1a;在教授/学习一门新语言时&#xff0c;会以输出“Hello World”作为第一个代码实例。 因…

javascript网站背景音乐

∶∶网站背景音乐∶∶ [怎么添加背景音乐]&#xff1a;将这段代码插入到您的<首页布告>内容中&#xff0c;当您打开网站时即可听到背景音乐&#xff1a; <bgsound src/textbook/matter/music/china.mid loop"-1"> [怎么换成自己喜欢的音乐]&#xff1a;…

剪切的文件还能恢复吗?挽救误操作

在我们使用电脑过程中&#xff0c;剪切文件是一个很常见的操作&#xff0c;因为将文件剪切下来再粘贴到其他地方可以更好地管理文件。但是&#xff0c;一些用户会在操作过程中意外地将文件在移动到目标位置之前剪切了&#xff0c;导致丢失了重要文件。在这种情况下&#xff0c;…

pyqt 取鼠标处文字_侧裙可拆按键随心装,黑爵GTi模块化游戏鼠标评测

虽然大家买电竞装备时还是会先看看罗技、雷蛇这些国际TOP大牌&#xff0c;但是国产品牌近年来也不乏很多不错的精品外设。之前上手评测过一款英菲克的电竞游戏鼠标&#xff0c;原以为并没有什么惊艳&#xff0c;但后来发外形和手感给人挺出乎意料的感受。今天这款黑爵GTi模块化…

2021年 IEEE VIS 科学可视化与体渲染论文整理与分析

因为最近工作的关系&#xff0c;需要研究一下IEEE VIS中2017年以后的与我之前主要方向&#xff08;体渲染、医学可视化&#xff09;有关的论文。我把这些年全部的论文进行了筛选和梳理&#xff0c;总共筛选出57篇论文&#xff0c;打算写一个文章来记录这些内容。这个栏目是2021…

TI AM62x工业核心板规格书(单/双/四核ARM Cortex-A53 + 单核ARM Cortex-M4F,主频1.4GHz)

1 核心板简介 创龙科技SOM-TL62x是一款基于TI Sitara系列AM62x单/双/四核ARM Cortex-A53 单核ARM Cortex-M4F异构多核处理器设计的高性能低功耗工业级核心板&#xff0c;通过工业级B2B连接器引出2x Ethernet、9x UART、3x CAN-FD、GPMC、2x USB 2.0、CSI、DISPLAY等接口。处理…

AI生成--Keep-alive

在 Vue.js 中&#xff0c;<keep-alive> 是一个抽象组件&#xff0c;与 <transition> 类似&#xff0c;它不会直接渲染到 DOM 中。它是用来将组件缓存到内存中&#xff0c;以避免重复渲染&#xff0c;同时保留组件的状态。 <keep-alive> 的使用方法如下&…