使用javascript模拟常见数据结构(二)
四、鏈表
每種語(yǔ)言都實(shí)現(xiàn)了數(shù)組。這種數(shù)據(jù)結(jié)構(gòu)非常方便,提供了一個(gè)便利的[]語(yǔ)法來訪問它的元素。然而,這種數(shù)據(jù)結(jié)構(gòu)有一個(gè)缺點(diǎn):(在大多數(shù)語(yǔ)言中)數(shù)組的大小是固定的,從數(shù)組的起點(diǎn)或中間插入或移除項(xiàng)的成本很高,因?yàn)樾枰苿?dòng)元素 。鏈表存儲(chǔ)有序的元素集合,但不同于數(shù)組,鏈表中的元素在內(nèi)存中并不是連續(xù)放置的。每個(gè)元素由一個(gè)存儲(chǔ)元素本身的節(jié)點(diǎn)和一個(gè)指向下一個(gè)元素的引用(也稱指針或鏈接)組成。下圖展示了一個(gè)鏈表的結(jié)構(gòu):?
相對(duì)于傳統(tǒng)的數(shù)組,鏈表的一個(gè)好處在于,添加或移除元素的時(shí)候不需要移動(dòng)其他元素。然而,鏈表需要使用指針,因此實(shí)現(xiàn)鏈表時(shí)需要額外注意。數(shù)組的另一個(gè)細(xì)節(jié)是可以直接訪問任何位置的任何元素,而要想訪問鏈表中間的一個(gè)元素,需要從起點(diǎn)(表頭)開始迭代列表直到找到所需的元素。?
首先,我們來創(chuàng)建一個(gè)鏈表:
function LinkedList() {var Node = function(element){ // {1}this.element = element;this.next = null; };var length = 0; // {2}var head = null; // {3}this.append = function(element){};this.insert = function(position, element){};this.removeAt = function(position){};this.remove = function(element){};this.indexOf = function(element){};this.isEmpty = function() {};this.size = function() {};this.toString = function(){};this.print = function(){}; }
如上所示,這是鏈表的追加元素的方法,如果頭指針指向了空,那證明還沒有元素,加入元素作為第一個(gè)元素,如果有元素,則找到鏈表的最后一個(gè)元素,使他的next指向加入的元素。
this.removeAt = function(position){ //檢查越界值if (position > -1 && position < length){var current = head,previous, index = 0; //移除第一項(xiàng)if (position === 0){ head = current.next;} else {while (index++ < position){previous = current;current = current.next;}//將previous與current的下一項(xiàng)鏈接起來:跳過current,從而移除它previous.next = current.next; }current.next = null;length--; return current.element;} else {return null; } };
那,這個(gè)是刪除元素,就不用贅述了吧。
this.insert = function(position, element){//檢查越界值if (position >= 0 && position <= length){var node = new Node(element),current = head,previous,index = 0;if (position === 0){ //在第一個(gè)位置添加node.next = current;head = node;} else {while (index++ < position){previous = current;current = current.next;}node.next = current; previous.next = node; }length++; //更新列表的長(zhǎng)度return true;} else {return false; } };
恩,按照位置插入的代碼也放在這里,請(qǐng)叫我雷鋒,哈哈。
?五、集合
集合是由一組無序且唯一(即不能重復(fù))的項(xiàng)組成的。這個(gè)數(shù)據(jù)結(jié)構(gòu)使用了與有限集合相同的數(shù)學(xué)概念,但應(yīng)用在計(jì)算機(jī)科學(xué)的數(shù)據(jù)結(jié)構(gòu)中。?
下面我們來創(chuàng)建一個(gè)集合,其實(shí)ES6里面已經(jīng)有了SET和MAP了,可以用babel轉(zhuǎn)換的話直接寫es6也是很好的。
function Set() {var items = {};this.has = function(value){};this.add = function(value){};
this.remove = function(value){};
this.clear = function(){};
this.size = function(){};
this.values = function(){};
}
?
相信上面的代碼大家看到名字基本就明白了,恩,照例貼一些代碼,Object.keys方法簡(jiǎn)直是神器呀。
this.has = function(value){return items.hasOwnProperty(value); };
?
this.add = function(value){if (!this.has(value)){items[value] = value;return true;}return false; };
?
this.remove = function(value){if (this.has(value)){delete items[value]; //{2}return true;}return false; };
?
this.clear = function(){items = {}; };
?
this.size= function(){var count = 0;for(var prop in items) { if(items.hasOwnProperty(prop)) {++count; }}return count; };
this.values = function(){return Object.keys(items); };
?
好的,今天就說這么多,下回繼續(xù)~
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/shicongbuct/p/6690520.html
總結(jié)
以上是生活随笔為你收集整理的使用javascript模拟常见数据结构(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不畏浮云遮望眼的作者是谁啊?
- 下一篇: 不育症怎么治疗