搜索
首页后端开发php教程从数组中存在的链表中删除节点

3217。从数组中存在的链表中删除节点

难度:中等

主题:数组、哈希表、链表

给你一个整数数组 nums 和一个链表的头。从链表中删除所有具有 nums 中存在值的节点后,返回修改后的链表的头

示例1:

  • 输入: nums = [1,2,3], head = [1,2,3,4,5]
  • 输出: [4,5]
  • 说明: Delete Nodes From Linked List Present in Array 删除值为 1、2 和 3 的节点。

示例2:

  • 输入: 输入:nums = [1], head = [1,2,1,2,1,2]
  • 输出: [2,2,2]
  • 说明: Delete Nodes From Linked List Present in Array 删除值为 1 的节点。

示例 3:

  • 输入: nums = [5], head = [1,2,3,4]
  • 输出: [1,2,3,4] Delete Nodes From Linked List Present in Array 没有节点的值为 5。

约束:

  • 1 5
  • 1 5
  • nums 中的所有元素都是唯一的。
  • 给定列表中的节点数量在 [1, 105] 范围内。
  • 1 5
  • 生成输入,使得链表中至少有一个节点的值不存在于 nums 中。

提示:

  1. 将 nums 的所有元素添加到 Set 中。
  2. 扫描列表,通过检查Set来检查当前元素是否应该被删除。

解决方案:

我们需要遍历链表并删除数组 nums 中存在值的所有节点。

方法:

  1. 用于快速查找的哈希集:由于检查 nums 中是否存在值需要高效,因此我们将 nums 转换为哈希集。这允许 O(1) 查找每个值。
  2. 迭代链表:我们将迭代链表并删除其值存在于哈希集中的节点。
  3. 指针操作:迭代时,我们将调整指针以“跳过”与 nums 数组中的值匹配的节点。

步骤:

  1. 将 nums 转换为哈希集以进行 O(1) 查找。
  2. 使用两个指针遍历链表:一个用于当前节点,一个用于前一个节点,以帮助高效删除节点。
  3. 对于每个节点,检查该值是否在哈希集中。如果是,则更新前一个节点的 next 以跳过当前节点。

让我们用 PHP 实现这个解决方案:3217。从数组中存在的链表中删除节点

<?php // Definition for a singly-linked list node.
class ListNode {
    public $val = 0;
    public $next = null;
    function __construct($val = 0, $next = null) {
        $this->val = $val;
        $this->next = $next;
    }
}

class Solution {

    /**
     * @param Integer[] $nums
     * @param ListNode $head
     * @return ListNode
     */
    function removeElements($head, $nums) {
        ...
        ...
        ...
        /**
         * go to ./solution.php
         */
    }
}

// Example usage:

// Linked List: 1 -> 2 -> 3 -> 4 -> 5
$head = new ListNode(1);
$head->next = new ListNode(2);
$head->next->next = new ListNode(3);
$head->next->next->next = new ListNode(4);
$head->next->next->next->next = new ListNode(5);

// Array nums: [1, 2, 3]
$nums = [1, 2, 3];

$solution = new Solution();
$result = $solution->removeElements($head, $nums);

// Function to print the linked list
function printList($node) {
    while ($node !== null) {
        echo $node->val . " ";
        $node = $node->next;
    }
}

// Print the resulting linked list
printList($result); // Output: 4 5
?>

解释:

  1. removeElements($head, $nums):

    • 我们首先将 nums 转换为哈希集 ($numSet = array_flip($nums);) 以进行快速查找。
    • 创建一个虚拟节点并将其链接到列表的头部。这有助于简化边缘情况,例如删除头节点。
    • 上一个指针跟踪当前节点之前的节点,允许我们通过在列表中跳过当前节点来删除它。
    • 对于每个节点,我们检查它的值是否在 numSet 中。如果是这样,我们通过调整 prev->next 指针来跳过当前节点来删除它。
  2. 边缘情况

    • 如果需要删除头节点,虚拟节点可确保可以干净地删除头节点并仍然返回正确的列表。
    • 处理需要删除多个连续节点的情况。
  3. 复杂性

    • 时间复杂度:O(n),其中n是链表中的节点数。我们访问每个节点一次。将 nums 转换为集合需要 O(m),其中 m 是 nums 的大小。
    • 空间复杂度:O(m),用于存储数字集。

演练示例:

对于输入 nums = [1, 2, 3] 和 head = [1, 2, 3, 4, 5],算法将:

  • 从节点1开始,检查nums中是否有1,然后将其删除。
  • 移动到节点 2,检查 2 是否在 nums 中,然后将其删除。
  • 移动到节点 3,检查 3 是否在 nums 中,然后将其删除。
  • 移动到节点 4 和 5,它们不在 nums 中,因此它们保留在列表中。

生成的链表是 [4, 5]。

联系链接

如果您发现本系列有帮助,请考虑在 GitHub 上给 存储库 一个星号或在您最喜欢的社交网络上分享该帖子?。您的支持对我来说意义重大!

如果您想要更多类似的有用内容,请随时关注我:

  • 领英
  • GitHub

以上是从数组中存在的链表中删除节点的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
unset()和session_destroy()有什么区别?unset()和session_destroy()有什么区别?May 04, 2025 am 12:19 AM

Thedifferencebetweenunset()andsession_destroy()isthatunset()clearsspecificsessionvariableswhilekeepingthesessionactive,whereassession_destroy()terminatestheentiresession.1)Useunset()toremovespecificsessionvariableswithoutaffectingthesession'soveralls

在负载平衡的情况下,什么是粘性会话(会话亲和力)?在负载平衡的情况下,什么是粘性会话(会话亲和力)?May 04, 2025 am 12:16 AM

stickysessensureuserRequestSarerOutedTothesMeServerForsessionDataConsisterency.1)sessionIdentificeAssificationAssigeaSsignAssignSignSuserServerServerSustersusiseCookiesorUrlModifications.2)一致的ententRoutingDirectSsssssubsequeSssubsequeSubsequestrequestSameSameserver.3)loadBellankingDisteributesNebutesneNewuserEreNevuseRe.3)

PHP中有哪些不同的会话保存处理程序?PHP中有哪些不同的会话保存处理程序?May 04, 2025 am 12:14 AM

phpoffersvarioussessionsionsavehandlers:1)文件:默认,简单的ButMayBottLeneckonHigh-trafficsites.2)Memcached:高性能,Idealforsforspeed-Criticalapplications.3)REDIS:redis:similartomemememememcached,withddeddeddedpassistence.4)withddeddedpassistence.4)databases:gelifforcontrati forforcontrati,有用

PHP中的会话是什么?为什么使用它们?PHP中的会话是什么?为什么使用它们?May 04, 2025 am 12:12 AM

PHP中的session是用于在服务器端保存用户数据以在多个请求之间保持状态的机制。具体来说,1)session通过session_start()函数启动,并通过$_SESSION超级全局数组存储和读取数据;2)session数据默认存储在服务器的临时文件中,但可通过数据库或内存存储优化;3)使用session可以实现用户登录状态跟踪和购物车管理等功能;4)需要注意session的安全传输和性能优化,以确保应用的安全性和效率。

说明PHP会话的生命周期。说明PHP会话的生命周期。May 04, 2025 am 12:04 AM

PHPsessionsstartwithsession_start(),whichgeneratesauniqueIDandcreatesaserverfile;theypersistacrossrequestsandcanbemanuallyendedwithsession_destroy().1)Sessionsbeginwhensession_start()iscalled,creatingauniqueIDandserverfile.2)Theycontinueasdataisloade

绝对会话超时有什么区别?绝对会话超时有什么区别?May 03, 2025 am 12:21 AM

绝对会话超时从会话创建时开始计时,闲置会话超时则从用户无操作时开始计时。绝对会话超时适用于需要严格控制会话生命周期的场景,如金融应用;闲置会话超时适合希望用户长时间保持会话活跃的应用,如社交媒体。

如果会话在服务器上不起作用,您将采取什么步骤?如果会话在服务器上不起作用,您将采取什么步骤?May 03, 2025 am 12:19 AM

服务器会话失效可以通过以下步骤解决:1.检查服务器配置,确保会话设置正确。2.验证客户端cookies,确认浏览器支持并正确发送。3.检查会话存储服务,如Redis,确保其正常运行。4.审查应用代码,确保会话逻辑正确。通过这些步骤,可以有效诊断和修复会话问题,提升用户体验。

session_start()函数的意义是什么?session_start()函数的意义是什么?May 03, 2025 am 12:18 AM

session_start()iscucialinphpformanagingusersessions.1)ItInitiateSanewsessionifnoneexists,2)resumesanexistingsessions,and3)setsasesessionCookieforContinuityActinuityAccontinuityAcconActInityAcconActInityAcconAccRequests,EnablingApplicationsApplicationsLikeUseAppericationLikeUseAthenticationalticationaltication and PersersonalizedContentent。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。