當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
数据结构与算法JavaScript描述——链表
生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法JavaScript描述——链表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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>
打印:
轉載于:https://www.cnblogs.com/tenWood/p/7231923.html
總結
以上是生活随笔為你收集整理的数据结构与算法JavaScript描述——链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stm32 输出PWM
- 下一篇: 机器学习中的EM算法具体解释及R语言实例