數據結構和算法之數組和鏈表

一、數組

數組是一種線性數據結構,它是由一組連續的內存單元組成的,用于存儲相同類型的數據。在JavaScript中,數組可以包含任意類型的數據,不只限于基本數據類型。

1.存儲方式

在內存中,數組的元素是連續存儲的,通過下標來訪問數組中的元素。例如,一個包含整型數據的數組可以用類似以下方式來表示:

let arr = [1, 2, 3, 4, 5];

2.訪問方式

通過數組下標來訪問數組中的元素,數組下標從0開始。例如,要訪問數組中的第三個元素,可以使用以下方式:

console.log(arr[2]); // 輸出3

3.時間復雜度

  • 訪問:由于數組中的元素是連續存儲的,通過下標訪問數組中的元素的時間復雜度是O(1)。因為可以直接通過下標計算出元素的內存地址。

4.插入刪除操作的復雜度

-== 插入和刪除操作對數組的時間復雜度為O(n)==。因為在插入或刪除一個元素時,需要將數組中的元素進行移動以保持元素的連續性,這將導致額外的時間開銷。例如,在數組的開頭插入一個元素將需要將之后的元素全部向后移動一個位置,這將是一個線性操作。

綜上所述,數組是一種靈活的數據結構,可以用于存儲和訪問大量元素。訪問操作的時間復雜度是固定的O(1),但插入和刪除操作的時間復雜度取決于操作的位置,可能是O(n)。

二、鏈表

鏈表是一種數據結構,它由多個節點組成,每個節點包含數據和指向下一個節點的指針。

從存儲方式來看,鏈表的節點是通過指針相連接的方式存儲在內存中。每個節點都包含一個指針,指向下一個節點的地址,這樣就形成了節點之間的連接。

舉例來說,可以用JavaScript實現一個簡單的鏈表節點:

class Node {constructor(data) {this.data = data;this.next = null;}
}

接著可以創建一個鏈表, 將多個節點連接起來:

let node1 = new Node(1);
let node2 = new Node(2);
node1.next = node2;

從訪問方式來看,鏈表的訪問是通過依次遍歷節點來訪問元素的。為了訪問特定位置的元素,需要從鏈表的頭節點開始順著指針找到對應位置的節點。

訪問鏈表的時間復雜度為O(n),其中n為鏈表的長度

對于插入和刪除操作,鏈表的復雜度取決于要插入或刪除的位置。如果要在鏈表頭部插入或刪除元素,時間復雜度為O(1);如果要在鏈表尾部插入或刪除元素,仍然是O(n)。

綜上所述,鏈表是一種靈活的數據結構,適合頻繁進行插入或刪除操作。

三、數組和鏈表的區別

數組和鏈表是兩種常見的數據結構,它們之間的主要區別在于數據的存儲方式和訪問方式。

1. 存儲方式:

  • 數組是一種連續的內存結構,所有元素在內存中相鄰存儲。數組的大小在創建時就確定了,可以通過下標來訪問任意位置的元素。
  • 鏈表是一種非連續的內存結構,元素在內存中通過指針相連。鏈表的大小可以動態增長或減少,每個節點保存了下一個節點的指針,通過遍歷來訪問元素。

2. 訪問方式:

  • 數組的元素可以直接通過下標來訪問,時間復雜度為O(1)。但插入或刪除元素時,需要移動其他元素,時間復雜度為O(n)。
  • 鏈表的元素需要通過遍歷從頭節點開始找到目標節點,時間復雜度為O(n)。但插入或刪除元素時,只需要修改指針,時間復雜度為O(1)。

綜上所述,數組適合需要頻繁隨機訪問元素的情況,而鏈表適合需要頻繁插入、刪除元素的情況。在實際應用中,我們根據具體的需求選擇不同的數據結構。

四、用js實現鏈表

// 定義節點類
class Node {// 節點類構造函數,接收數據作為參數constructor(data) {this.data = data; // 節點存儲的數據this.next = null; // 指向下一個節點的指針}
}// 定義鏈表類
class LinkedList {// 鏈表類構造函數constructor() {this.head = null; // 鏈表的頭節點}// 添加節點到鏈表末尾append(data) {let newNode = new Node(data); // 創建新節點if (this.head === null) { // 如果鏈表為空this.head = newNode; // 新節點就是頭節點} else { // 如果鏈表不為空let current = this.head; // 從頭節點開始while (current.next !== null) { // 遍歷鏈表current = current.next; // 移動到下一個節點}current.next = newNode; // 將新節點添加到鏈表末尾}}// 刪除指定值的節點delete(data) {if (this.head === null) { // 如果鏈表為空return; // 直接返回}if (this.head.data === data) { // 如果頭節點就是要刪除的節點this.head = this.head.next; // 頭節點指向下一個節點return;}let current = this.head; // 從頭節點開始let prev = null; // 記錄當前節點的前一個節點while (current !== null) { // 遍歷鏈表if (current.data === data) { // 如果找到要刪除的節點prev.next = current.next; // 前一個節點指向當前節點的下一個節點return;}prev = current; // 記錄當前節點current = current.next; // 移動到下一個節點}}// 查找指定值的節點find(data) {let current = this.head; // 從頭節點開始while (current !== null) { // 遍歷鏈表if (current.data === data) { // 如果找到指定值的節點return current; // 返回該節點}current = current.next; // 移動到下一個節點}return null; // 如果沒有找到,返回 null}// 修改指定節點的值update(data, newData) {let node = this.find(data); // 查找指定值的節點if (node !== null) { // 如果找到該節點node.data = newData; // 修改該節點的值}}// 打印鏈表print() {let current = this.head; // 從頭節點開始let arr = [];while (current !== null) { // 遍歷鏈表arr.push(current.data); // 將節點的數據添加到數組中current = current.next; // 移動到下一個節點}console.log(arr.join('=>')); // 打印鏈表}
}// 測試鏈表功能
let list = new LinkedList();
list.append(1); // 添加節點 1
list.append(2); // 添加節點 2
list.append(3); // 添加節點 3console.log("Initial Linked List:");
list.print(); // 打印鏈表list.delete(2); // 刪除節點 2
console.log("After deleting '2':");
list.print(); // 打印鏈表list.update(3, 4); // 將節點 3 的值修改為 4
console.log("After updating '3' to '4':");
list.print(); // 打印鏈表let newNode = new Node(1); 
console.log(newNode); // 輸出 Node { data: 1, next: null }

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24197.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24197.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24197.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Vue】組件的存放目錄問題

注意: .vue文件 本質無區別 組件分類 .vue文件分為2類,都是 .vue文件(本質無區別) 頁面組件 (配置路由規則時使用的組件)復用組件(多個組件中都使用到的組件) 存放目錄 分類開來的…

Llama模型家族之拒絕抽樣(Rejection Sampling)(二)均勻分布簡介

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…

ssti模板注入

一、Flask應用 1、介紹 定義 Flask:是一個使用Python編寫的輕量級web應用框架。Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。 特點 良好的文檔、豐富的插件、包含開發服務器和調試器、集成支持單元測試、RESTful請求調度、支持安全cookies、基于Unicode。 …

手機短信刪除怎么恢復?快速找回的3個秘密武器

手機,這個我們每天離不開的小玩意兒,有時候也會讓我們頭疼不已。比如,你一不小心,或者為了清理點空間,就把那些重要的短信給刪了。這些短信可能是你和好友的深夜聊天,或者是重要的工作信息。一旦刪除&#…

人工智能就業方向有哪些?

人工智能就業方向有哪些? 隨著人工智能技術的不斷發展,其應用領域也越來越廣泛。對于想要進入人工智能領域的年輕人來說,選擇一個合適的職業方向是至關重要的。今天給大家介紹六個熱門的人工智能就業方向,分別是機器學習工程師、自然語言處理…

Webshell檢測初識

最近在研究webshell檢測的小東西,所以開啟一個專門記錄webshell檢測工具開發的專欄,若有遺漏之處,請大佬們指出。 本篇大致了解以下內容 什么是webshll?有哪些類型?各自有什么不同?Webshell有哪些常見的檢測…

鼠標側鍵映射虛擬桌面切換 —— Win11

鼠標側鍵映射虛擬桌面切換 —— Win11 基于 AutoHotkey 實現功能 下載軟件 AutoHotkey建議安裝在默認路徑下(C盤) 此軟件非常小,幾乎不占用資源軟件安裝在默認路徑以外的位置可能導致部分功能不可用 新建一個 .ahk 文件使用記事本打開該 .a…

哪款開放式耳機佩戴最舒服?2024五款備受推崇產品分享!

?在現今耳機市場,開放式耳機憑借其舒適的佩戴體驗和獨特的不入耳設計,備受消費者追捧。它們不僅讓你在享受音樂時,仍能察覺周圍的聲音,確保與人交流無障礙,而且有利于耳朵的衛生與健康。對于運動愛好者和耳機發燒友而…

GIGE 協議摘錄 —— 引導寄存器(四)

系列文章目錄 GIGE 學習筆記 GIGE 協議摘錄 —— 設備發現(一) GIGE 協議摘錄 —— GVCP 協議(二) GIGE 協議摘錄 —— GVSP 協議(三) GIGE 協議摘錄 —— 引導寄存器(四) GIGE 協議…

Flutter Dismissible 屬性介紹及使用指南

在移動應用開發中,滑動刪除是一種常見的交互方式。Flutter 提供了一個強大的小部件 Dismissible,使得實現這一功能變得非常簡單。本文將介紹 Dismissible 的主要屬性及其使用方法。 1. Dismissible 簡介 Dismissible 是一個 Flutter 小部件&#xff0c…

前后端實現文件上傳進度條-實時進度

后端接口代碼&#xff1a; PostMapping("/upload")public ResponseEntity<String> handleFileUpload(RequestParam("file") MultipartFile file) {try {// 獲取文件名String fileName file.getOriginalFilename();// 創建上傳目標路徑Path targetPa…

基于簡單Agent對醫療數據進行分析

數據表 供應商資格審核規定.pdf 醫生名錄.xlsx 歷史就診記錄.xlsx 患者信息名錄.xlsx 藥品.xlsx 藥品庫存管理.xlsx 采購單位基本信息.xlsx Agent測試 模型基于ChatGPT-3.5 問題&#xff1a;幫我找出不達標的供應商 Agent分析過程 [Thought: 0] Key Concepts: - 不達標的供…

P7 品牌管理

逆向生成頁面 新增菜單—商品系統的品牌管理 —product/brand 在代碼生成器得到的文件中&#xff0c; main-resources-src-views-modules-product brand.vue、brand-add-or-update.vue放到category.vue同級vue文件有新增、刪除按鈕&#xff0c;但頁面未顯示&#xff0c;是因…

嵌入式Linux系統中RTC應用的操作詳解

第一:RTC的作用以及時間簡介 “RTC”的英文全稱是Reul-Time Clock,翻譯過來是實時時鐘芯片.實時時鐘芯片是日常生活中應用最為廣泛的電子器件之一,它為人們或者電子系統提供精確的實時時間,實時時鐘芯片通過引腳對外提供時間讀寫接口,通常內部帶有電池,保證在外部系統關…

【Android】使用EventBus進行線程間通訊

EventBus 簡介 EventBus&#xff1a;github EventBus是Android和Java的發布/訂閱事件總線。 簡化組件之間的通信 解耦事件發送者和接收者 在 Activities, Fragments, background threads中表現良好 避免復雜且容易出錯的依賴關系和生命周期問題 Publisher使用post發出…

好書推薦-人工智能數學基礎

本書以零基礎講解為宗旨&#xff0c;面向學習數據科學與人工智能的讀者&#xff0c;通俗地講解每一個知識點&#xff0c;旨在幫助讀者快速打下數學基礎。    全書分為 4 篇&#xff0c;共 17 章。其中第 1 篇為數學知識基礎篇&#xff0c;主要講述了高等數學基礎、微積分、泰…

鴻蒙Ability Kit(程序框架服務)【應用啟動框架AppStartup】

應用啟動框架AppStartup 概述 AppStartup提供了一種更加簡單高效的初始化組件的方式&#xff0c;支持異步初始化組件加速應用的啟動時間。使用啟動框架應用開發者只需要分別為待初始化的組件實現AppStartup提供的[StartupTask]接口&#xff0c;并在[startup_config]中配置App…

Open vSwitch 數據包處理流程

一、Open vSwitch 數據包轉發模式 Open vSwitch 根據不同的模塊使用&#xff0c;主要分為兩種數據包的轉發模式&#xff1a;Datapath 模式和 DPDK 模式&#xff0c;這兩種模式的主要區別在于&#xff1a; Datapath 模式&#xff1a; 使用內核空間的網絡棧進行數據包的轉發性能相…

理解和實現 LRU 緩存置換算法

引言 在計算機科學中&#xff0c;緩存是一種用于提高數據訪問速度的技術。然而&#xff0c;緩存空間是有限的&#xff0c;當緩存被填滿時&#xff0c;就需要一種策略來決定哪些數據應該保留&#xff0c;哪些應該被淘汰。LRU&#xff08;最近最少使用&#xff09;算法是一種廣泛…

UML實現圖-部署圖

概述 部署圖(Deployent Diagram)描述了運行軟件的系統中硬件和軟件的物理結構。部署圖中通常包含兩種元素:節點和關聯關系&#xff0c;部署圖中每個配置必須存在于某些節點上。部署圖也可以包含包或子系統。 節點是在運行時代表計算機資源的物理元素。節點名稱有兩種:簡單名和…