摘要:線性結(jié)構(gòu)數(shù)組與鏈表線性結(jié)構(gòu)線性數(shù)據(jù)結(jié)構(gòu)有兩端,有時(shí)被稱(chēng)為左右,某些情況被稱(chēng)為前后。將兩個(gè)線性數(shù)據(jù)結(jié)構(gòu)區(qū)分開(kāi)的方法是添加和移除項(xiàng)的方式,特別是添加和移除項(xiàng)的位置。相對(duì)于數(shù)組,鏈表的好處在于,添加或移除元素的時(shí)候不需要移動(dòng)其他元素。
線性結(jié)構(gòu) 數(shù)組與鏈表 線性結(jié)構(gòu)
線性數(shù)據(jù)結(jié)構(gòu)有兩端,有時(shí)被稱(chēng)為左右,某些情況被稱(chēng)為前后。你也可以稱(chēng)為頂部和底部,名字都不重要。將兩個(gè)線性數(shù)據(jù)結(jié)構(gòu)區(qū)分開(kāi)的方法是添加和移除項(xiàng)的方式,特別是添加和移除項(xiàng)的位置。例如一些結(jié)構(gòu)允許從一端添加項(xiàng),另一些允許從另一端移除項(xiàng)。
數(shù)組或列表數(shù)組(Array)是編程界最常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),有些編程語(yǔ)言被稱(chēng)作位列表(List)。幾乎所有編程語(yǔ)言都原生內(nèi)置數(shù)組類(lèi)型,只是形式向略有不同,因?yàn)閿?shù)組是最簡(jiǎn)單的內(nèi)存數(shù)據(jù)結(jié)構(gòu)。
數(shù)組的定義是:一個(gè)存儲(chǔ)元素的線性集合(Collection),元素可以通過(guò)索引(Index)來(lái)任意存取,索引通常是數(shù)字,用來(lái)計(jì)算元素之間存儲(chǔ)位置的偏移量。
鏈表數(shù)組的缺點(diǎn):要存儲(chǔ)多個(gè)元素,數(shù)組(或列表)可能是最常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)。但是數(shù)組不總是組織數(shù)據(jù)的最佳結(jié)構(gòu)。在大多數(shù)編程語(yǔ)言中,數(shù)組的大小是固定的,所以當(dāng)數(shù)組被填滿時(shí),再要加入新的元素會(huì)非常困難。并且從數(shù)組起點(diǎn)或中間插入或移除元素的成本很高,因?yàn)樾枰獙?shù)組中的其他元素向前后平移。
鏈表(Linked list)中的元素在內(nèi)存中不是連續(xù)存放的。鏈表是由一組節(jié)點(diǎn)(Node)組成的集合,每個(gè)節(jié)點(diǎn)由元素本身和一個(gè)指向下一個(gè)元素的引用(也被稱(chēng)作鏈接或指針)組成。相對(duì)于數(shù)組,鏈表的好處在于,添加或移除元素的時(shí)候不需要移動(dòng)其他元素。
鏈表的種類(lèi)單向鏈表(Singly linked list):是最基本的鏈表,每個(gè)節(jié)點(diǎn)一個(gè)引用,指向下一個(gè)節(jié)點(diǎn)。單向鏈表的第一個(gè)節(jié)點(diǎn)稱(chēng)為頭節(jié)點(diǎn)(head node),最后一個(gè)節(jié)點(diǎn)稱(chēng)為尾節(jié)點(diǎn)(tail node),尾節(jié)點(diǎn)的引用為空(None),不指向下一個(gè)節(jié)點(diǎn)。
雙向鏈表(Doubly linked list)和單向鏈表的區(qū)別在于,在鏈表中的節(jié)點(diǎn)引用是雙向的,一個(gè)指向下一個(gè)元素,一個(gè)指向上一個(gè)元素。
循環(huán)鏈表(Circular linked list)和單向鏈表類(lèi)似,節(jié)點(diǎn)類(lèi)型都一樣。唯一的區(qū)別是 ,鏈表的尾節(jié)點(diǎn)引用指向頭節(jié)點(diǎn)。
雙向循環(huán)鏈表:類(lèi)似于雙向鏈表,尾節(jié)點(diǎn)的后置引用指向頭節(jié)點(diǎn),頭節(jié)點(diǎn)的前置引用指向尾節(jié)點(diǎn)。
單向鏈表的操作方法 | 操作 |
---|---|
append | 向鏈表尾部添加一個(gè)元素 |
insert | 在鏈表的指定位置插入一個(gè)元素 |
pop | 從鏈表特定位置刪除并返回元素 |
remove | 從鏈表中刪除給定的元素 |
find | 返回元素的索引 |
iter | 迭代鏈表元素 |
size | 獲取鏈表大小 |
clear | 清空鏈表 |
# python3 class Node: def __init__(self, value=None, next=None): self.value = value self.next = next class LinkedList: def __init__(self): self.head = None self.tail = None self.size = 0 def append(self, value): node = Node(value) if self.head is None: self.head = node self.tail = node else: self.tail.next = node self.tail = node self.size += 1 def insert(self, index, value): if 0 <= index <= self.size: node = Node(value) current = self.head previous = Node(next=current) count = 0 while count < index: previous = current current = current.next count += 1 previous.next = node node.next = current if previous.value is None: self.head = node if node.next is None: self.tail = node self.size += 1 return True else: return False def pop(self, index): if 0 <= index <= self.size and self.head is not None: current = self.head previous = Node(next=current) count = 0 while count < index: previous = current current = current.next count += 1 previous.next = current.next if previous.value is None: self.head = current.next if current.next is None: self.tail = previous self.size -= 1 return current.value else: return None def remove(self, item): found = False current = self.head previous = Node(next=current) index = 0 while not found and current is not None: if current.value == item: found = True else: previous = current current = current.next index += 1 if found: previous.next = current.next if previous.value is None: self.head = current.next if current.next is None: self.tail = previous self.size -= 1 return index else: return -1 def find(self, item): current = self.head count = 0 while current is not None: if current.value == item: return count else: current = current.next count += 1 return -1 def iter(self): current = self.head while current is not None: yield current.value current = current.next def size(self): return self.size def clear(self): self.head = None self.tail = None self.size = 0 def is_empty(self): return self.size == 0 def __len__(self): return self.size() def __iter__(self): iter self.iter() def __getitem__(self, index): return self.find(index) def __contains__(self, item): return self.find(item) != -1JavaScript實(shí)現(xiàn)單向鏈表
// ES6 class Node { constructor(value=null, next=null) { this.value = value; this.next = next; } } class LinkedList { constructor() { this.head = null; this.tail = null; this.size = 0; } append(value) { let node = new Node(value); if (this.head === null) { this.head = node; this.tail = node; } else { this.tail.next = temp; this.tail = temp; } this.size += 1; } insert(index, value) { if (0 <= index <= this.size) { let node = new Node(value); let current = this.head; let previous = new Node(next=current); let count = 0; while (count < index) { previous = current; current = current.next; count += 1; } previous.next = node node.next = current if (previous.value === null) { this.head = node; } if (node.next === null) { this.tail = node; } this.size += 1 return true; } else { return false; } } pop(index) { if (0 <= index <= self.size && this.head === null) { let current = this.head; let previous = new Node(next=current); let count = 0; while (count < index) { previous = current; current = current.next; count += 1; } previous.next = current.next; if (previous.value === null) { this.head = current.next; } if (current.next === null) { this.tail = previous; } this.size -= 1; return current.value; } else { return null; } } remove(item) { let found = false; let current = this.head; let previous = new Node(next=current); let index = 0; while (! found && current !== null) { if (current.value === item) { found = true; } else { previous = current; current = current.next; } index += 1 } if (found) { previous.next = current.next; if (previous.value === null) { this.head = current.next; } if (current.next === null) { this.tail = previous; } this.size -= 1; return index; } else { return -1; } } find(item) { let current = this.head; let count = 0; while (current !== null) { if (current.value === item) { return count; } else { current = current.next; count += 1; } } return -1; } iter() { let current = this.head; while (current !== null) { yield current.value; current = current.next; } } size() { return this.size; } clear() { this.head = null; this.tail = null; this.size = 0; } isEmpty() { return this.size === 0; } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44808.html
摘要:線性結(jié)構(gòu)數(shù)組與鏈表線性結(jié)構(gòu)線性數(shù)據(jù)結(jié)構(gòu)有兩端,有時(shí)被稱(chēng)為左右,某些情況被稱(chēng)為前后。將兩個(gè)線性數(shù)據(jù)結(jié)構(gòu)區(qū)分開(kāi)的方法是添加和移除項(xiàng)的方式,特別是添加和移除項(xiàng)的位置。相對(duì)于數(shù)組,鏈表的好處在于,添加或移除元素的時(shí)候不需要移動(dòng)其他元素。 線性結(jié)構(gòu) 數(shù)組與鏈表 線性結(jié)構(gòu) 線性數(shù)據(jù)結(jié)構(gòu)有兩端,有時(shí)被稱(chēng)為左右,某些情況被稱(chēng)為前后。你也可以稱(chēng)為頂部和底部,名字都不重要。將兩個(gè)線性數(shù)據(jù)結(jié)構(gòu)區(qū)分開(kāi)的方法...
摘要:數(shù)據(jù)結(jié)構(gòu)可以分為列表線性樹(shù)形圖四種基本結(jié)構(gòu)。即承載數(shù)據(jù)的形式。數(shù)據(jù)結(jié)構(gòu)中的線性結(jié)構(gòu)有數(shù)組和鏈表,本文即對(duì)鏈表進(jìn)行簡(jiǎn)單總結(jié),在后續(xù)文章中會(huì)實(shí)現(xiàn)幾種基本的數(shù)據(jù)結(jié)構(gòu)。 緣起 最近工作上需要依照現(xiàn)有數(shù)據(jù)生成嵌套json對(duì)象形式的組織機(jī)構(gòu)列表,一時(shí)覺(jué)得無(wú)從下手,請(qǐng)教同事大神才知道此乃數(shù)據(jù)結(jié)構(gòu)相關(guān)知識(shí),遂惡補(bǔ)相關(guān)基礎(chǔ)并在此記錄。 數(shù)據(jù)結(jié)構(gòu)可以分為:1、列表;2、線性;3、樹(shù)形;4、圖 四種基本...
摘要:為檢查長(zhǎng)度為的列表,二分查找需要執(zhí)行次操作。最后需要指出的一點(diǎn)是高水平的讀者可研究一下二叉樹(shù)關(guān)于二叉樹(shù),戳這里數(shù)據(jù)結(jié)構(gòu)與算法二叉樹(shù)算法常見(jiàn)練習(xí)在一個(gè)二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。 常見(jiàn)數(shù)據(jù)結(jié)構(gòu) 簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu)(必須理解和掌握) 有序數(shù)據(jù)結(jié)構(gòu):棧、隊(duì)列、鏈表。有序數(shù)據(jù)結(jié)構(gòu)省空間(儲(chǔ)存空間?。?無(wú)序數(shù)據(jù)結(jié)構(gòu):集合、字典、散列表,無(wú)序...
摘要:為檢查長(zhǎng)度為的列表,二分查找需要執(zhí)行次操作。最后需要指出的一點(diǎn)是高水平的讀者可研究一下二叉樹(shù)關(guān)于二叉樹(shù),戳這里數(shù)據(jù)結(jié)構(gòu)與算法二叉樹(shù)算法常見(jiàn)練習(xí)在一個(gè)二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。 常見(jiàn)數(shù)據(jù)結(jié)構(gòu) 簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu)(必須理解和掌握) 有序數(shù)據(jù)結(jié)構(gòu):棧、隊(duì)列、鏈表。有序數(shù)據(jù)結(jié)構(gòu)省空間(儲(chǔ)存空間?。?無(wú)序數(shù)據(jù)結(jié)構(gòu):集合、字典、散列表,無(wú)序...
摘要:為檢查長(zhǎng)度為的列表,二分查找需要執(zhí)行次操作。最后需要指出的一點(diǎn)是高水平的讀者可研究一下二叉樹(shù)關(guān)于二叉樹(shù),戳這里數(shù)據(jù)結(jié)構(gòu)與算法二叉樹(shù)算法常見(jiàn)練習(xí)在一個(gè)二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。 常見(jiàn)數(shù)據(jù)結(jié)構(gòu) 簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu)(必須理解和掌握) 有序數(shù)據(jù)結(jié)構(gòu):棧、隊(duì)列、鏈表。有序數(shù)據(jù)結(jié)構(gòu)省空間(儲(chǔ)存空間?。?無(wú)序數(shù)據(jù)結(jié)構(gòu):集合、字典、散列表,無(wú)序...
閱讀 579·2023-04-25 16:00
閱讀 1624·2019-08-26 13:54
閱讀 2503·2019-08-26 13:47
閱讀 3434·2019-08-26 13:39
閱讀 1052·2019-08-26 13:37
閱讀 2748·2019-08-26 10:21
閱讀 3544·2019-08-23 18:19
閱讀 1609·2019-08-23 18:02