陣列 vs. 串列:軟體工程師必備的資料結構學習筆記

更新於 發佈於 閱讀時間約 9 分鐘

軟體工程師職涯升級計畫啟動!立即預約職涯諮詢、履歷健檢或模擬面試👈,為您的加薪做好準備!

在學習演算法與資料結構的路上,理解「資料如何儲存與操作」是關鍵起點。最近參加了 AC 演算法專攻班,課程即將邁入尾聲,收穫滿滿。這次免費課程讓我真正掌握了演算法的核心觀念,尤其在解題時的邏輯與資料結構選擇,對我影響很深。

趁熱打鐵,紀錄下「Array 陣列」與「Linked List 串列」這兩個基礎資料結構的學習筆記與比較,並補充 JS 範例與常見使用情境。


🔑 學習重點整理

重點說明

  • 結構: 語言是否內建?可否自行實作?
  • 特性: 優缺點、適合場景
  • 方法: 常見 API + 時間複雜度分析

一、📦 Array 陣列

raw-image

✅ 結構

  • 幾乎所有語言皆內建,如 JavaScript、Python、C++。
  • 字串本質上也是一種字元陣列。

✅ 特性

  • 支援隨機存取 array[index],時間複雜度 O(1)。
  • 記憶體連續配置、空間利用率高。

✅ 常見操作與時間複雜度

raw-image

📌 補充知識

  • 陣列可透過記憶體 offset 快速定位。
  • JavaScript push()unshift() 等方法本質上仍會觸發搬移或 resize 操作。

✅ JavaScript 實作

js
複製編輯class ArrayDemo {
constructor() {
this.arr = [];
}

get(index) {
return this.arr[index];
}

insertAtEnd(value) {
this.arr.push(value);
}

insertAtFront(value) {
this.arr.unshift(value);
}

delete(index) {
this.arr.splice(index, 1);
}

binarySearch(target) {
let left = 0, right = this.arr.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (this.arr[mid] === target) return mid;
if (this.arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}

print() {
console.log(this.arr);
}
}

// 🧪 測試
const a = new ArrayDemo();
a.insertAtEnd(3);
a.insertAtEnd(5);
a.insertAtFront(1);
a.print(); // [1, 3, 5]
console.log(a.get(1)); // 3
a.delete(1);
a.print(); // [1, 5]
console.log(a.binarySearch(5)); // 1(前提是已排序)

二、🔗 Linked List 串列

raw-image

✅ 結構

  • 每個節點(node)由資料與指標組成。
  • 指標指向下一個節點。
text
複製編輯[1][2][3]null

✅ 特性

  • 插入刪除:不需搬移,調整指標即可。
  • 存取需從頭依序走訪,無隨機存取功能。

✅ 常見操作與時間複雜度

raw-image

✅ JavaScript 實作

js
複製編輯class Node {
constructor(value) {
this.value = value;
this.next = null;
}
}

class LinkedList {
constructor() {
this.head = null;
}

insertAtFirst(value) {
const newNode = new Node(value);
newNode.next = this.head;
this.head = newNode;
}

insertAtEnd(value) {
const newNode = new Node(value);
if (!this.head) {
this.head = newNode;
return;
}
let current = this.head;
while (current.next) current = current.next;
current.next = newNode;
}

deleteAtHead() {
if (this.head) this.head = this.head.next;
}

delete(value) {
if (!this.head) return;
if (this.head.value === value) {
this.head = this.head.next;
return;
}
let current = this.head;
while (current.next && current.next.value !== value) {
current = current.next;
}
if (current.next) current.next = current.next.next;
}

search(value) {
let current = this.head, index = 0;
while (current) {
if (current.value === value) return index;
current = current.next;
index++;
}
return -1;
}

print() {
const result = [];
let current = this.head;
while (current) {
result.push(current.value);
current = current.next;
}
console.log(result);
}
}

// 🧪 測試
const list = new LinkedList();
list.insertAtFirst(3);
list.insertAtFirst(1);
list.insertAtEnd(5);
list.print(); // [1, 3, 5]
console.log(list.search(3)); // 1
list.delete(3);
list.print(); // [1, 5]
list.deleteAtHead();
list.print(); // [5]

三、🆚 陣列 vs 串列

raw-image

四、📌 何時選哪個?

raw-image

🧠 延伸資源


這兩種基礎資料結構,看似簡單,但實際運用與演算法搭配時,會發現每一個選擇背後都藏著複雜的 trade-off。理解這些基本觀念,不僅能幫助寫出高效的程式,也能在面對不同題型時做出正確選擇。

留言
avatar-img
留言分享你的想法!
avatar-img
跨越國界的程式人生
2會員
37內容數
自學程式,現為網頁開發工程師,同時擔任線上課程講師,專注於幫助自學程式的開發者找到理想工作。熱愛技術與分享,致力於將複雜的概念轉化為實用知識,讓更多人踏入軟體開發的世界。
2025/07/22
本文深入探討各種資料模型(關聯式、文件、圖形)及其查詢語言(SQL、MapReduce、Cypher、SPARQL),比較其優缺點及適用場景,並以實際案例說明如何選擇最適合的資料模型與查詢語言。
Thumbnail
2025/07/22
本文深入探討各種資料模型(關聯式、文件、圖形)及其查詢語言(SQL、MapReduce、Cypher、SPARQL),比較其優缺點及適用場景,並以實際案例說明如何選擇最適合的資料模型與查詢語言。
Thumbnail
2025/07/21
這篇文章整理了軟體工程師技術面試常見的演算法題型,包含排列組合、搜尋、排序、樹與鏈結串列等,並提供對應的JavaScript實作與LeetCode題號,幫助你係統性準備面試。
Thumbnail
2025/07/21
這篇文章整理了軟體工程師技術面試常見的演算法題型,包含排列組合、搜尋、排序、樹與鏈結串列等,並提供對應的JavaScript實作與LeetCode題號,幫助你係統性準備面試。
Thumbnail
2025/07/21
這篇文章深入淺出地探討 React 的 useEffect Hook 在處理多個非同步請求時的執行順序,並提供使用 Promise.all 等待所有 API 回應後再渲染畫面的解決方案。文中並包含程式碼範例與詳細的步驟說明,協助讀者理解 useEffect 的運作機制與常見問題。
Thumbnail
2025/07/21
這篇文章深入淺出地探討 React 的 useEffect Hook 在處理多個非同步請求時的執行順序,並提供使用 Promise.all 等待所有 API 回應後再渲染畫面的解決方案。文中並包含程式碼範例與詳細的步驟說明,協助讀者理解 useEffect 的運作機制與常見問題。
Thumbnail
看更多
你可能也想看
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
這篇內容,將會講解什麼是資料型態,以及與資料型態相關的知識。包括資料型態的簡介、實數、布林值、 字串、陣列。
Thumbnail
這篇內容,將會講解什麼是資料型態,以及與資料型態相關的知識。包括資料型態的簡介、實數、布林值、 字串、陣列。
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
Thumbnail
資料的統合 在程式設計中,其他人通常關心是否注意到執行的細節。作為程式設計師,主要應該關心的是程式的表現,但往往忽略了很多細節,這些細節可以決定程式的好壞。程式的好壞很大程度上取決於資料的統合,也就是資料是否被正規化。 不同類型的資料在系統中呈現一致 正規化可能對一些人來說聽起來很抽象,有些人
Thumbnail
資料的統合 在程式設計中,其他人通常關心是否注意到執行的細節。作為程式設計師,主要應該關心的是程式的表現,但往往忽略了很多細節,這些細節可以決定程式的好壞。程式的好壞很大程度上取決於資料的統合,也就是資料是否被正規化。 不同類型的資料在系統中呈現一致 正規化可能對一些人來說聽起來很抽象,有些人
Thumbnail
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
Thumbnail
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News