搜尋
首頁後端開發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
可以在PHP會話中存儲哪些數據?可以在PHP會話中存儲哪些數據?May 02, 2025 am 12:17 AM

phpsessionscanStorestrings,數字,數組和原始物。

您如何開始PHP會話?您如何開始PHP會話?May 02, 2025 am 12:16 AM

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考慮使用AttActAcks.s.s.4)

什麼是會話再生,如何提高安全性?什麼是會話再生,如何提高安全性?May 02, 2025 am 12:15 AM

會話再生是指在用戶進行敏感操作時生成新會話ID並使舊ID失效,以防會話固定攻擊。實現步驟包括:1.檢測敏感操作,2.生成新會話ID,3.銷毀舊會話ID,4.更新用戶端會話信息。

使用PHP會話時有哪些性能考慮?使用PHP會話時有哪些性能考慮?May 02, 2025 am 12:11 AM

PHP会话对应用性能有显著影响。优化方法包括:1.使用数据库存储会话数据,提升响应速度;2.减少会话数据使用,只存储必要信息;3.采用非阻塞会话处理器,提高并发能力;4.调整会话过期时间,平衡用户体验和服务器负担;5.使用持久会话,减少数据读写次数。

PHP會話與Cookie有何不同?PHP會話與Cookie有何不同?May 02, 2025 am 12:03 AM

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

PHP如何識別用戶的會話?PHP如何識別用戶的會話?May 01, 2025 am 12:23 AM

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

確保PHP會議的一些最佳實踐是什麼?確保PHP會議的一些最佳實踐是什麼?May 01, 2025 am 12:22 AM

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

PHP會話文件默認存儲在哪裡?PHP會話文件默認存儲在哪裡?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

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

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具