Linked Lists

Similar documents
Linked Lists

Microsoft PowerPoint - lecture5

3. 給 定 一 整 數 陣 列 a[0] a[1] a[99] 且 a[k]=3k+1, 以 value=100 呼 叫 以 下 兩 函 式, 假 設 函 式 f1 及 f2 之 while 迴 圈 主 體 分 別 執 行 n1 與 n2 次 (i.e, 計 算 if 敘 述 執 行 次 數, 不

演算法導入、ソート、データ構造、ハッシュ

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

資料結構之C語言重點複習








1

01

1

Microsoft Word - 第三章第一節第二節.doc

untitled

Explain each of the following terms. (12%) (a) O(n 2 ) (b) protected in C++ language (c) sparse matrix 7. Write

untitled

C 1

VHDL(Statements) (Sequential Statement) (Concurrent Statement) VHDL (Architecture)VHDL (PROCESS)(Sub-program) 2

Microsoft Word - 1HF12序.doc

Microsoft Word - 讀報看科普─人體篇_橫_.doc

Microsoft Word - 2B802內文.doc

鍟嗗搧瑙傚療鈥㈤挗鏉

席 远 杨 一 人 了, 正 当 她 开 枪 时 却 发 现 子 弹 没 了 该 死, 只 能 赤 手 空 拳 了 洛 水 云 与 席 远 杨 交 起 手 来, 洛 水 云 出 手 招 招 致 命 想 那 席 远 杨 也 不 是 泛 泛 之 辈, 很 快 掌 握 了 洛 水 云 出 招 路 数 看

東區校園中法治教育種子師資教學研習營

閱 讀 素 材 V.S 分 組 方 式 的 差 異 化 教 學 工 具 表 班 級 :( ) 閱 讀 素 材 V.S 分 組 方 式 獨 立 閱 讀 夥 伴 閱 讀 ( 同 質 性 ) 夥 伴 閱 讀 ( 異 質 性 ) 友 善 陪 伴 虛 心 受 教 國 語 日 報 新 聞 生 活 文 藝 兒 童

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

使 用 一 般 佇 列 存 放 資 料 時, 當 前 端 (Front) 尚 有 空 位 時, 再 加 入 元 素, 卻 發 現 此 佇 列 已 滿, 請 問 此 時 使 用 下 列 那 一 個 方 法 較 佳? (A) 優 先 佇 列 (B) 環 形 佇 列 (C) 雙 向 佇 列

汇集全球21位医生的经验和智慧,总结出最实用的专业建议,这些都是最值得你牢记的健康提醒

1 行 业 发 展 不 平 衡 我 国 房 地 产 中 介 服 务 业 起 步 较 晚, 专 业 分 工 程 度 和 国 外 发 达 国 家 相 比 还 有 很 大 差 距 房 地 产 中 介 服 务 行 业 的 发 展 水 平 与 房 地 产 开 发 行 业 的 市 场 化 水 平 密 切 相 关

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Queue & stack

Fuzzy Highlight.ppt

Microsoft PowerPoint - Lecture3.ppt

TX-NR3030_BAS_Cs_ indd

PowerPoint Presentation

若 心 中 放 著 一 座 空 鳥 籠, 總 有 一 天 會 把 某 個 東 西, 放 進 那 裡 面 李 秉 律

1

Microsoft Word - data_mid1611_and_sol.docx

PowerPoint Presentation

CC213

(Microsoft PowerPoint - \270\352\256\306\265\262\272c\302\262\263\370.ppt)

(390) 宋 史.indd /12/3 10:03:20 AM

untitled

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

Searching and Sorting

untitled

<4D F736F F F696E74202D A451A447A67EB0EAB1D0A74BB8D5A44ABEC7B8A8C249A4C0AA52BB50A7D3C440BFEFB6F1B5A6B2A4205BACDBAE65BCD2A6A15D>

stack_and_queue

Microsoft PowerPoint - os_4.ppt

立 志 于 打 造 最 贴 近 考 生 实 际 的 辅 导 书 计 算 机 考 研 之 数 据 结 构 高 分 笔 记 率 辉 编 著 周 伟 张 浩 审 核 讨 论 群 :

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C Project 30 C Project 3 60 Project 40

Agenda 大 纲 FIFO data-structures 先 进 先 出 ( FIFO) 数 据 结 构 (= First In First Out) Heap data-structures 堆 结 构 Non-static methods 非 静 态 方 法 (= object metho

Microsoft PowerPoint - Model Checking a Lazy Concurrent List-Based Set Algorithm.ppt [Compatibility Mode]

,,, 19,,,,,,,,, 2 ( ),, Etiquette,,,,,,,,,,

ebook39-6

Open topic Bellman-Ford算法与负环

ebook39-5

ACI pdf

Microsoft PowerPoint - ds-1.ppt [兼容模式]


Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

CC213

ebook14-4

ROP_bamboofox.key

untitled

投影片 1

从 IT 到 DT 的 城 市 服 务 报 告 摘 要 以 控 制 为 出 发 点 的 IT 时 代, 正 在 走 向 激 活 生 产 力 为 目 的 DT 时 代 DT 城 市, 是 以 云 网 端 为 城 市 新 型 基 础 设 施, 以 大 数 据 为 城 市 新 型 生 产 资 料, 以 数

運算子多載 Operator Overloading

參 行 動 教 學 模 式 教 材 及 教 學 工 具 運 用 課 程 設 計 作 品 上 傳 教 師 線 上 批 閱 成 立 麗 山 雲 端 校 內 Moodle 平 台 導 覽 資 料 庫 教 材 置 於 雲 端 教 學 網 站 校 園 觀 察 拍 照 創 作 詩 文 學 生 線 上 互 評 創

AL-M200 Series

工业和信息化部 水利部 全国节约用水办公室

Strings

Chapter 16 集合

穨japhkesch.PDF

Microsoft Word - 133氣象與地震.doc

WinMDI 28

Excel VBA Excel Visual Basic for Application

新・明解C言語入門編『索引』

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

提纲 1 2 OS Examples for 3

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

Microsoft PowerPoint - chapter5part2.pptx

Microsoft PowerPoint - 04-array_pointer.ppt

全国计算机技术与软件专业技术资格(水平)考试

说 : 荀 子 极 偏 驳, 只 一 句 性 恶, 大 本 已 失 5 朱 熹 说 : 荀 扬 不 惟 说 性 不 是, 从 头 到 底 皆 不 识 6 采 取 的 都 是 这 种 理 论 框 架 另 一 种 理 论 框 架 始 于 20 世 纪 前 期, 这 便 是 诸 子 学 研 究 的 框 架

L15 MIPS Assembly

C++ 程式設計

Microsoft Word - ACL chapter02-5ed.docx

untitled

[剑指offer] 面试题43:n个骰子的点数(Java),[剑指offer] 面试题42: 翻转单词顺序 VS左旋转字符串(Java),[剑指offer] 面试题41:和为s的两个数字VS和为s的连续序列

第 二 章 校 草 出 现 圣 迪 亚 学 院, 一 所 远 近 闻 名 的 贵 族 学 院 它 的 知 名 度 就 好 像 猪 的 知 名 度 一 样, 无 人 不 知 无 人 不 晓 是 所 有 人 都 向 往 的 学 校 圣 迪 亚 学 院 是 以 欧 式 建 筑 风 格 为 主 的 大 门

Microsoft Word - 21??¡N??`?C?~??-1.doc, page Normalize ( Microsoft Word - 21ºÝ¤È¸`§C¦~¯Å-1.doc )

2/80 2

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1

2013 C 1 #include <stdio.h> 2 int main(void) 3 { 4 int cases, i; 5 long long a, b; 6 scanf("%d", &cases); 7 for (i = 0; i < cases; i++) 8 { 9 scanf("%

Transcription:

LINKED LISTS Prof. Michael Tsai 2013/3/12

2 大家來吐 Array 的槽 Array 有什麼不好? 插入新 element 1 3 4新的 24 52 空 5 刪除原本的 element 1 3 42 25 5 Time complexity= O(??)

3 Array 的複雜度 Indexing ( 拿某一個元素 ) 在開頭 Insert/Delete 在尾巴 Insert/Delete 在中間 Insert/Delete Array Dynamic Array ( 滿了以後擴充成兩倍 ) O(1) O(1)?? O(n), only feasible if not full O(1), only feasible if not full O(n), only feasible if not full O(n)?? O(1), if not full O(n), if full Linked List ( 今天要學的 )?? O(n)?? 浪費的空間 0 O(n)??

4 新朋友 : Linked List 要怎麼讓資料 1. 可以隨便亂排 2. 但是我們仍然知道他的順序? 答案 : 資料亂排 但是, 另外存 下一個是誰 index [0] [1] [2] [3] [4] 資料 下一個是誰 ㄇㄆㄅㄉㄈ 4 0 1-1 3 開始 1

5 概念上, 應該是長這樣 開始 ㄅㄆㄇㄈㄉ Null 真正的樣子 : index [0] [1] [2] [3] [4] 資料 下一個是誰 ㄇㄆㄅㄉㄈ 4 0 1-1 3 開始 2

6 增加一個人? 開始 ㄅㄆㄇㄈㄉ Null ㄐ index [0] [1] [2] [3] [4] [5] 資料 下一個是誰 ㄇ ㄆ ㄅ ㄉ ㄈ ㄐ 4 50 1-1 3 0 開始 2

7 刪掉一個人 開始 ㄅㄆㄇㄈㄉ Null ㄐ index [0] [1] [2] [3] [4] [5] 資料 下一個是誰 ㄇㄆㄅㄉㄈㄐ 4 5 1-1 3 04 開始 2

8 來看一些 code ( 用 malloc/free) 怎麼宣告一個 node 的 struct? struct ListNode { int data; struct ListNode *next; }; 怎麼拿一個新的 node? struct ListNode *new; new=(struct ListNode*)malloc(sizeof(struct listnode));

9 來看一些 code new 是指標, 指到一個 struct listnode 的變數. 那如果要拿這個變數裡面的 data 呢? 可以這樣寫 : (*new).data 或者, new->data 要拿 next 呢? (*new).next 或者, new->next

10 來看一些 code head 342 551 假設 head 指到第一個 struct ListNode 那麼我要拿到 551 的下一個 ListNode 的位址怎麼寫? head->link->link ( 連續技 )

11 製造兩個 node head 342 551 struct ListNode *head, *tmp; tmp=(struct ListNode*)malloc(sizeof(struct ListNode)); if (tmp==null) exit(-1); // exit program on error tmp->data=551; tmp->next=null; head=tmp; tmp=(struct ListNode*)malloc(sizeof(struct ListNode)); tmp->data=342; tmp->next=head; head=tmp;

12 插入一個新 node 在某 node 後面 struct ListNode *x; // 指到要插入的 node 的位置 struct ListNode *new; new=(struct ListNode*)malloc(sizeof(struct ListNode)); new->data=123; 下一步呢? 先處理 new->next 還是 x->next? new->next=x->next; x->next=new; x 123 new 342 342 551

13 刪除某一個 node struct ListNode *head; // 指到一開始的 node 的位置 struct ListNode *x; // 指到要刪除的 node 的位置 struct ListNode *trail; // 指到 x 的前一個 node 的位置 分兩種狀況處理 : x 是頭, 還有 x 不是頭 if (trail) //x 不是第一個 node trail->next=x->next; head x 551 else free(x); head=x->next; trail x 342 342 342 551

14 Examples 印出整個 linked list struct ListNode *tmp; for(tmp=head; tmp!=null; tmp=tmp->next) printf( %d, tmp->data); 找到某個 node 有 data 的前一個 node 的位置 int a=123; // 假設我們要找資料是 123 的 node 的前一個 node 位置 struct ListNode *tmp; for(tmp=head; tmp!=null; tmp=tmp->next) { if (tmp->next!=null) { // 因為 tmp->next 可能是 NULL! if (tmp->next->data==a) break; // break 出去的時候, tmp 就是我們要的 } }

15 Array 和 Linked List 的複雜度比較 Indexing ( 拿某一個元素 ) 在開頭 Insert/Delete 在尾巴 Insert/Delete 在中間 Insert/Delete 浪費的空間 ( 不是拿來存資料的部分 ) Array Dynamic Array ( 滿了以後擴充成兩倍 ) O(1) O(1) O(n) O(n), only feasible if not full O(1), only feasible if not full O(n), only feasible if not full O(n) O(1), if not full O(n), if full O(n) 0 ( 存滿以後 ) O(n) ( 最多可能有一半的空間是空的 ) Linked List O(1) O(n) 找到尾巴 O(1) insert/delete O(n) 找到位置 O(1) insert/delete O(n) ( 每個 node 都有拿來存 next node 的位址欄位 )

16 < 動腦時間 > 有沒有什麼是 array 比 linked list 好的? 什麼時候用 array? 什麼時候用 linked list? < 練習題 1> 我想要找 linked list 裡面從尾巴數過來的第 k 個 node, 要怎麼寫 code? 時間複雜度為? 練習題 1 答案 : O(n), Karumanchi 3.10 problem 2,4,5

17 Example: Stacks & Queues 如果是一塊記憶體要放很多 stack 或 queue 就很難做到很 efficient 例如如果某一 stack 滿了, 就要把一堆資料往後擠 就不是 O(1) 了 T_T 解決 : 跟 Linked List 當朋友

18 Stack 要怎麼拿來當 stack 呢? ( 想想怎麼做主要的 operation) push & pop 請一位同學來講解 head 資 訊 工 程 系 Null 例 : push( 學 ) head 當作 stack top 怎麼寫 code? 那 pop 呢?

19 Queue 類似 stack 的作法 不過頭尾都要有一個指標 從頭拿, 從尾放 front rear 資訊工程 Null 怎麼拿? (DeQueue) struct ListNode* tmp; tmp=front; front=front->link; tmp_data=tmp->data; free(tmp); return tmp_data;

Queue new 20 系 front rear 資 訊 工 程 那怎麼放? 假設 new 是指到新的 node rear->next=new; new->next=null; rear=new;

21 練習題 2: 把 linked list 反過來 反過來 : 把 a 3 14 2 8 1 0 變成 b 1 0 2 8 3 14 怎麼弄? 答案 : Karumanchi 3.10 problem 16

22 Singly v.s. doubly linked list Singly linked list: head Doubly linked list: 3 14 2 8 1 0 head 3 14 2 8 1 0 什麼時候需要用雙? Singly linked list 只能往後, 不能往前 ( 要從最前面開始重新找 ) Doubly linked list 用在常常需要 倒帶 的時候 好處 : 倒帶方便 (O(1)) ( 想想在 singly linked list 裡面要刪掉一個 node 時, 必須要找到前一個 node) 壞處 : 兩個 pointer 的儲存空間 Insert/delete 的時候稍微慢一點 ( 要處理兩個 pointer, next & prev)

23 回收很慢 要把一個用完的 linked list 每個 node 都 free 掉 (Why?) 有幾項就要幾項的時間 : O(n) 懶人方法 : 丟到一個 回收桶, 之後需要的時候再撿出來 希望丟 =O(1), 而且撿 =O(1) 怎麼做? 回收桶 3 14 a 2 8 1 0 關鍵 : 找尾巴很慢. ( 不是 O(1)) 但是又不想多花空間紀錄尾巴

24 Circular List 開始 的那個箭頭, 指在尾巴 最後一個 node 指回開頭 有什麼好處? 串接很方便! 丟進回收桶 =O(1)!! temp 3 14 2 8 1 0 回收桶 head 也可以有 doubly circular linked list!

25 暫停! 來回想一下我們學了哪些種類的 linked list Singly linked list Circular Non-circular (chain) Doubly linked list Circular Non-circular (chain)

26 Today s Reading Assignments Karumanchi 3.1-3.8 有很多的 source code, 特別是 3.6 的部分是基礎, 一定要看懂! Karumanchi 3.10 problem {2,4,5},{15,16},{24,25,27}