當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
数据结构与算法JavaScript描述——链表
生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法JavaScript描述——链表
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.數(shù)組的缺點(diǎn) 數(shù)組不總是組織數(shù)據(jù)的最佳數(shù)據(jù)結(jié)構(gòu),原因如下。 在很多編程語言中,數(shù)組的長(zhǎng)度是固定的,所以當(dāng)數(shù)組已被數(shù)據(jù)填滿時(shí),再要加入新的元素就會(huì)非常困難。 在數(shù)組中,添加和刪除元素也很麻煩,因?yàn)樾枰獙?shù)組中的其他元素向前或向后平移,以反映數(shù)組剛剛進(jìn)行了添加或刪除操作。 然而,JavaScript 的數(shù)組并不存在上述問題,因?yàn)槭褂胹plice() 方法不需要再訪問數(shù)組中的其他元素了。 JavaScript 中數(shù)組的主要問題是,它們被實(shí)現(xiàn)成了對(duì)象,與其他語言(比如C++ 和Java)的數(shù)組相比,效率很低 如果你發(fā)現(xiàn)數(shù)組在實(shí)際使用時(shí)很慢,就可以考慮使用鏈表來替代它。除了對(duì)數(shù)據(jù)的隨機(jī)訪問,鏈表幾乎可以用在任何可以使用一維數(shù)組的情況中。 如果需要隨機(jī)訪問,數(shù)組仍然是更好的選擇。 2.定義鏈表 鏈表是由一組節(jié)點(diǎn)組成的集合。每個(gè)節(jié)點(diǎn)都使用一個(gè)對(duì)象的引用指向它的后繼。指向另一個(gè)節(jié)點(diǎn)的引用叫做鏈。 數(shù)組元素靠它們的位置進(jìn)行引用,鏈表元素則是靠相互之間的關(guān)系進(jìn)行引用。 鏈表中插入一個(gè)節(jié)點(diǎn)的效率很高。 向鏈表中插入一個(gè)節(jié)點(diǎn),需要修改它前面的節(jié)點(diǎn)(前驅(qū)),使其指向新加入的節(jié)點(diǎn),而新加入的節(jié)點(diǎn)則指向原來前驅(qū)指向的節(jié)點(diǎn)。 從鏈表中刪除一個(gè)元素也很簡(jiǎn)單。 將待刪除元素的前驅(qū)節(jié)點(diǎn)指向待刪除元素的后繼節(jié)點(diǎn), 同時(shí)將待刪除元素指向null,元素就刪除成功了。 鏈表還有其他一些操作,但插入和刪除元素最能說明鏈表為什么如此有用。 3.設(shè)計(jì)一個(gè)基于對(duì)象的鏈表 我們?cè)O(shè)計(jì)的鏈表包含兩個(gè)類。 Node 類用來表示節(jié)點(diǎn),LinkedList 類提供了插入節(jié)點(diǎn)、刪除節(jié)點(diǎn)、顯示列表元素的方法,以及其他一些輔助方法。 Node類: LinkedList類: 插入新節(jié)點(diǎn): insert,該方法向鏈表中插入一個(gè)節(jié)點(diǎn)。向鏈表中插入新節(jié)點(diǎn)時(shí),需要明確指出要在哪個(gè)節(jié)點(diǎn)前面或后面插入。 如何在一個(gè)已知節(jié)點(diǎn)后面插入元素: 在一個(gè)已知節(jié)點(diǎn)后面插入元素時(shí),先要找到“后面”的節(jié)點(diǎn)。為此,創(chuàng)建一個(gè)輔助方法find(),該方法遍歷鏈表,查找給定數(shù)據(jù)。如果找到數(shù)據(jù),該方法就返回保存該數(shù)據(jù)的節(jié)點(diǎn)。 find() 方法演示了如何在鏈表上進(jìn)行移動(dòng)。首先,創(chuàng)建一個(gè)新節(jié)點(diǎn),并將鏈表的頭節(jié)點(diǎn)賦給這個(gè)新創(chuàng)建的節(jié)點(diǎn)。 然后在鏈表上進(jìn)行循環(huán),如果當(dāng)前節(jié)點(diǎn)的element 屬性和我們要找的信息不符,就從當(dāng)前節(jié)點(diǎn)移動(dòng)到下一個(gè)節(jié)點(diǎn)。 如果查找成功,該方法返回包含該數(shù)據(jù)的節(jié)點(diǎn);否則,返回null。 從鏈表中刪除一個(gè)節(jié)點(diǎn): 從鏈表中刪除節(jié)點(diǎn)時(shí),需要先找到待刪除節(jié)點(diǎn)前面的節(jié)點(diǎn)。找到這個(gè)節(jié)點(diǎn)后,修改它的next 屬性,使其不再指向待刪除節(jié)點(diǎn),而是指向待刪除節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)。 代碼實(shí)現(xiàn): <script type="text/javascript">
/**
* Node類:
* element 用來保存節(jié)點(diǎn)上的數(shù)據(jù)
* next 用來保存指向下一個(gè)節(jié)點(diǎn)的鏈接
*/
function Node(element){this.element = element;this.next = null;
}/**
* LinkedList類
* LList 類提供了對(duì)鏈表進(jìn)行操作的方法。
* 包括插入刪除節(jié)點(diǎn)、在列表中查找給定的值。
* 鏈表只有一個(gè)屬性,那就是使用一個(gè)Node 對(duì)象來保存該鏈表的頭節(jié)點(diǎn)。
*
* head 節(jié)點(diǎn)的next 屬性被初始化為null
* 當(dāng)有新元素插入時(shí),next 會(huì)指向新的元素,所以在這里我們沒有修改next 的值。
*/
function LList(){this.head = new Node("head");this.find = find;this.insert = insert;this.remove = remove;this.display = display;this.findPrevious = findPrevious;
}/**
* 遍歷鏈表,查找給定數(shù)據(jù)。
* 如果找到數(shù)據(jù),該方法就返回保存該數(shù)據(jù)的節(jié)點(diǎn)
*/
function find(item){var currNode = this.head;while(currNode.element != item){currNode = currNode.next;}return currNode;
}/*
* 插入新節(jié)點(diǎn)
* 在item元素(已知節(jié)點(diǎn))后面插入newElement
*/
function insert(newElement, item){var newNode = new Node(newElement);var current = this.find(item);newNode.next = current.next;current.next = newNode;
}/**
* 查找待刪除元素的上一個(gè)節(jié)點(diǎn)
* 該方法遍歷鏈表中的元素,檢查每一個(gè)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)中是否存儲(chǔ)著待刪除數(shù)據(jù)。
* 如果找到,返回該節(jié)點(diǎn)(即“前一個(gè)”節(jié)點(diǎn))
*/
function findPrevious(item){var currNode = this.head;while(currNode.next!=null && currNode.next.element != item){currNode = currNode.next;}return currNode;
}/**
* 從鏈表中刪除節(jié)點(diǎn)
* 需要先找到待刪除節(jié)點(diǎn)前面的節(jié)點(diǎn)。
* 找到這個(gè)節(jié)點(diǎn)后,修改它的next 屬性,使其不再指向待刪除節(jié)點(diǎn),而是指向待刪除節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)。
*/
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;}
}//測(cè)試代碼
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>
打印:
轉(zhuǎn)載于:https://www.cnblogs.com/tenWood/p/7231923.html
總結(jié)
以上是生活随笔為你收集整理的数据结构与算法JavaScript描述——链表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stm32 输出PWM
- 下一篇: 二、SpringMVC的常用注解——1-