203_移除链表元素

news/2024/9/30 9:24:49

203_移除链表元素

【问题描述】

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

示例一:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]示例二:
输入:head = [], val = 1
输出:[]示例三:
输入:head = [7,7,7,7], val = 7
输出:[]

提示:

  • 列表中的节点数目在范围 [0, 104]
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

【算法设计思想】

  1. 首先是应对重复出现的情况,例如1、1、1、1、这样的链表,我们可以使用一个while循环来逐个删除。
  2. 然后是检查head,即当前链表是否为空,如果是空,那么我们直接返回head就好了。
  3. 最后是一般情况,使用while循环来处理一般的情况,在这里需要注意prev->next->val的值不是val时才移动指针,否则会出现跳过重复元素的情况。

【算法描述】

C++:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/class Solution {
public:ListNode* removeElements(ListNode* head, int val) {// 移除所有位于链表头部且值为val的节点while (head != nullptr && head->val == val) {ListNode* toDelete = head; // 保存当前头节点head = head->next; // 更新头节点为下一个节点delete toDelete; // 释放被删除节点的内存}// 如果链表为空,直接返回if (head == nullptr)return head;// 初始化 prev 指针,从头节点开始ListNode* prev = head;// 遍历链表,移除值为val的节点while (prev->next != nullptr) {if (prev->next->val == val) {ListNode* temp = prev->next; // 保存需要删除的节点prev->next = temp->next; // 跳过需要删除的节点delete temp; // 释放被删除节点的内存} else {prev = prev->next; // 只有当 prev->next 的值不是 val 时才移动 prev 指针}}return head; // 返回处理后的链表头节点}
};

Java:

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeElements(ListNode head, int val) {// 移除所有位于链表头部且值为val的节点while (head != null && head.val == val) {ListNode toDelete = head; // 保存当前头节点head = head.next; // 更新头节点为下一个节点toDelete = null; // 释放被删除节点的引用,让垃圾回收器回收}// 如果链表为空,直接返回if (head == null) {return head;}// 初始化 prev 指针,从头节点开始ListNode prev = head;// 遍历链表,移除值为val的节点while (prev.next != null) {if (prev.next.val == val) {ListNode temp = prev.next; // 保存需要删除的节点prev.next = temp.next; // 更新 prev.next 指向下一个节点temp = null; // 释放被删除节点的引用,让垃圾回收器回收} else {prev = prev.next; // 只有当 prev.next 的值不是 val 时才移动 prev 指针}}return head; // 返回处理后的链表头节点}
}

Python:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = nextclass Solution:def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:# 移除所有位于链表头部且值为val的节点while head is not None and head.val == val:toDelete = head  # 保存当前头节点head = head.next  # 更新头节点为下一个节点del toDelete  # 释放被删除节点的内存# 如果链表为空,直接返回if head is None:return head# 初始化 prev 指针,从头节点开始prev = head# 遍历链表,移除值为val的节点while prev.next is not None:if prev.next.val == val:temp = prev.next  # 保存需要删除的节点prev.next = temp.next  # 更新 prev.next 指向下一个节点del temp  # 释放被删除节点的内存else:prev = prev.next  # 只有当 prev.next 的值不是 val 时才移动 prev 指针return head  # 返回处理后的链表头节点

C:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val) {// 移除所有位于链表头部且值为val的节点while (head != NULL && head->val == val) {struct ListNode* temp = head; // 保存当前头节点head = head->next; // 更新头节点为下一个节点free(temp); // 释放被删除节点的内存}// 如果链表为空,直接返回if (head == NULL) {return head;}// 初始化 prev 指针,从头节点开始struct ListNode* prev = head;// 遍历链表,移除值为val的节点while (prev->next != NULL) {if (prev->next->val == val) {struct ListNode* temp = prev->next; // 保存需要删除的节点prev->next = temp->next; // 更新 prev.next 指向下一个节点free(temp); // 释放被删除节点的内存} else {prev = prev->next; // 只有当 prev.next 的值不是 val 时才移动 prev 指针}}return head; // 返回处理后的链表头节点
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/66411.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

1845. 座位预约管理系统

请你设计一个管理 n 个座位预约的系统,座位编号从 1 到 n 。 请你实现 SeatManager 类: SeatManager(int n) 初始化一个 SeatManager 对象,它管理从 1 到 n 编号的 n 个座位。所有座位初始都是可预约的。 int reserve() 返回可以预约座位的 最小编号 ,此座位变为不可预约。…

CMSIS-RTOS V2封装层专题视频,一期视频将常用配置和用法梳理清楚,适用于RTX5和FreeRTOS(2024-09-28)

【前言】 本期视频就一个任务,通过ARM官方的CMSIS RTOS文档,将常用配置和用法给大家梳理清楚。对于初次使用CMSIS-RTOS的用户来说,通过梳理官方文档,可以系统的了解各种用法,方便大家再进一步的自学或者应用,起到授人以渔的作用。更深入的可以看之前分享的RTOS运行机制,…

小白生于天地之间,岂能郁郁难挖高危?

想要在挂了WAF的站点挖出高危,很难,因为这些站点,你但凡鼠标点快点,检测出了不正确动作都要给你禁IP,至于WAF绕过对于小白更是难搞。其实在众测,大部分漏洞都并非那些什么SQL注入RCE等等,而小白想要出高危,可能也只有寄托希望与未授权。小白的众测高危: 记先前某次众测…

opencascade TopoDS_Iterator源码学习拓扑迭代器

opencascade TopoDS_Iterator 前言 遍历给定 TopoDS_Shape 对象的底层形状,提供对其组件子形状的访问。每个组件形状作为带有方向的 TopoDS_Shape 返回,并且由原始值和相对值组成的复合体。 方法 1 //! 创建一个空的迭代器。 TopoDS_Iterator(); 2 //! 子形状上创建一个迭代器…

浅谈笛卡尔树

[介绍(百度百科)](笛卡尔树_百度百科 (baidu.com)) 笛卡尔树是一种特定的二叉树数据结构,可由数列构造,在范围最值查询、范围\(top_k\)查询(range top k queries)等问题上有广泛应用。它具有堆的有序性,中序遍历可以输出原数列。笛卡尔树结构由Vuillmin(1980)在解决范围…

9.30

[实验任务一]:UML复习 阅读教材第一章复习UML,回答下述问题: 面向对象程序设计中类与类的关系都有哪几种?分别用类图实例说明。 1. 继承:2. 实现:3. 关联: 4. 聚合: 5. 组合: 6. 依赖:

9.30 实验1:UML与面向对象程序设计原则

[实验任务一]:UML复习阅读教材第一章复习UML,回答下述问题:面向对象程序设计中类与类的关系都有哪几种?分别用类图实例说明。 1. 继承关系 Students类继承People类 2.实现关系 一个class类实现interface接口(可以是多个)的功能 3.依赖关系 一个类A使用到了另一…

Windows平台下安装与配置MySQL9

要在Windows平台下安装MySQL,可以使用图行化的安装包。图形化的安装包提供了详细的安装向导,以便于用户一步一步地完成对MySQL的安装。本节将详细介绍使用图形化安装包安装MySQL的方法。 1.2.1 安装MySQL 要想在Windows中运行MySQL,需要32位或64位Windows操作系统,例如Win…