1. 程式人生 > >數據結構與算法JavaScript描述——鏈表

數據結構與算法JavaScript描述——鏈表

問題 為什麽 什麽 ren 數組元素 說明 節點 前驅 困難

1.數組的缺點                                           數組不總是組織數據的最佳數據結構,原因如下。 在很多編程語言中,數組的長度是固定的,所以當數組已被數據填滿時,再要加入新的元素就會非常困難。 在數組中,添加和刪除元素也很麻煩,因為需要將數組中的其他元素向前或向後平移,以反映數組剛剛進行了添加或刪除操作。 然而,JavaScript 的數組並不存在上述問題,因為使用splice() 方法不需要再訪問數組中的其他元素了。 JavaScript 中數組的主要問題是,它們被實現成了對象,與其他語言(比如C++ 和Java)的數組相比,效率很低 如果你發現數組在實際使用時很慢,就可以考慮使用鏈表來替代它。除了對數據的隨機訪問,鏈表幾乎可以用在任何可以使用一維數組的情況中。 如果需要隨機訪問,數組仍然是更好的選擇。 2.定義鏈表                                                  
鏈表是由一組節點組成的集合。每個節點都使用一個對象的引用指向它的後繼。指向另一個節點的引用叫做鏈。 數組元素靠它們的位置進行引用,鏈表元素則是靠相互之間的關系進行引用。 鏈表中插入一個節點的效率很高。 向鏈表中插入一個節點,需要修改它前面的節點(前驅),使其指向新加入的節點,而新加入的節點則指向原來前驅指向的節點。 從鏈表中刪除一個元素也很簡單。 將待刪除元素的前驅節點指向待刪除元素的後繼節點, 同時將待刪除元素指向null,元素就刪除成功了。 技術分享 鏈表還有其他一些操作,但插入和刪除元素最能說明鏈表為什麽如此有用。 3.設計一個基於對象的鏈表                                        
我們設計的鏈表包含兩個類。 Node 類用來表示節點,LinkedList 類提供了插入節點、刪除節點、顯示列表元素的方法,以及其他一些輔助方法。 Node類: LinkedList類: 插入新節點: insert,該方法向鏈表中插入一個節點。向鏈表中插入新節點時,需要明確指出要在哪個節點前面或後面插入。 如何在一個已知節點後面插入元素: 在一個已知節點後面插入元素時,先要找到“後面”的節點。為此,創建一個輔助方法find(),該方法遍歷鏈表,查找給定數據。如果找到數據,該方法就返回保存該數據的節點。 find() 方法演示了如何在鏈表上進行移動。首先,創建一個新節點,並將鏈表的頭節點賦給這個新創建的節點。 然後在鏈表上進行循環,如果當前節點的element 屬性和我們要找的信息不符,就從當前節點移動到下一個節點。 如果查找成功,該方法返回包含該數據的節點;否則,返回null。 從鏈表中刪除一個節點: 從鏈表中刪除節點時,需要先找到待刪除節點前面的節點。找到這個節點後,修改它的next 屬性,使其不再指向待刪除節點,而是指向待刪除節點的下一個節點。 代碼實現:
<script type="text/javascript">
/*
* * Node類: * element 用來保存節點上的數據 * next 用來保存指向下一個節點的鏈接 */ function Node(element){ this.element = element; this.next = null; } /** * LinkedList類 * LList 類提供了對鏈表進行操作的方法。 * 包括插入刪除節點、在列表中查找給定的值。 * 鏈表只有一個屬性,那就是使用一個Node 對象來保存該鏈表的頭節點。 * * head 節點的next 屬性被初始化為null * 當有新元素插入時,next 會指向新的元素,所以在這裏我們沒有修改next 的值。 */ function LList(){ this.head = new Node("head"); this.find = find; this.insert = insert; this.remove = remove; this.display = display; this.findPrevious = findPrevious; } /** * 遍歷鏈表,查找給定數據。 * 如果找到數據,該方法就返回保存該數據的節點 */ function find(item){ var currNode = this.head; while(currNode.element != item){ currNode = currNode.next; } return currNode; } /* * 插入新節點 * 在item元素(已知節點)後面插入newElement */ function insert(newElement, item){ var newNode = new Node(newElement); var current = this.find(item); newNode.next = current.next; current.next = newNode; } /** * 查找待刪除元素的上一個節點 * 該方法遍歷鏈表中的元素,檢查每一個節點的下一個節點中是否存儲著待刪除數據。 * 如果找到,返回該節點(即“前一個”節點) */ function findPrevious(item){ var currNode = this.head; while(currNode.next!=null && currNode.next.element != item){ currNode = currNode.next; } return currNode; } /** * 從鏈表中刪除節點 * 需要先找到待刪除節點前面的節點。 * 找到這個節點後,修改它的next 屬性,使其不再指向待刪除節點,而是指向待刪除節點的下一個節點。 */ function remove(item){ var prevNode = this.findPrevious(item); if(prevNode.next != null){ prevNode.next = prevNode.next.next; } } /* * 顯示鏈表中的元素 */ function display(){ var currNode = this.head; while(currNode.next != null){ console.log(currNode.next.element); currNode = currNode.next; } } //測試代碼 var cities = new LList(); cities.insert("Conway", "head"); cities.insert("Russellville", "Conway"); cities.insert("Carlisle", "Russellville"); cities.insert("Alma", "Carlisle"); cities.display(); cities.remove("Carlisle"); cities.display(); </script>

打印:

技術分享

數據結構與算法JavaScript描述——鏈表