js單向鏈表的具體實(shí)現(xiàn)實(shí)例
function linkNode(_key, _value)
{
/// <summary>
/// 鏈表類(lèi)的節(jié)點(diǎn)類(lèi)
/// </summary>
this.Key = _key;
this.Value = _value;
this.next = null;
}
function Link()
{
/// <summary>
/// 創(chuàng)建一個(gè)鏈表類(lèi)
/// </summary>
this.root = new linkNode(null, null); //root永遠(yuǎn)是個(gè)空節(jié)點(diǎn)
this.end = this.root;
}
Link.prototype =
{
count: 0,
value: function (_key)
{
/// <summary>
/// 根據(jù)key的值來(lái)獲取value值
/// </summary>
/// <param name="_key" type="String">
/// key的值
/// </param>
/// <returns type="Object">
/// 對(duì)應(yīng)的value的值
/// </returns>
var i = this.root;
while (Boolean(i = i.next))
{
if (i.Key == _key)
return i.Value;
}
},
add: function (_key, _value)
{
/// <summary>
/// 往鏈表的尾部中加入一個(gè)節(jié)點(diǎn)
/// </summary>
/// <param name="_key" type="String">
/// key的值
/// </param>
/// <param name="_value" type="Object">
/// value的值
/// </param>
/// <returns type="Object">
/// 返回新增加的value的值
/// </returns>
var i = this.root;
while (Boolean(i = i.next))
{
if (i.Key == _key)
return i.Value = _value;
}
var node = new linkNode(_key, _value);
if (this.count == 0)
this.root.next = node;
else
this.end.next = node;
this.end = node;
this.count++;
return _value;
},
insert: function (_key, node)
{
/// <summary>
/// 從鏈表類(lèi)的某節(jié)點(diǎn)之后插入新節(jié)點(diǎn)node.
/// </summary>
/// <param name="_key" type="String">
/// 在鍵值等于_key的元素之后插入
/// </param>
/// <param name="node" type="Object">
/// 要插入的元素
/// </param>
var i = this.root;
while (Boolean(i = i.next))
{
if (i.Key == _key)
{
var tmp = i.next;
i.next = node;
node.next = tmp;
break;
}
}
},
insertBefore: function (_key, node)
{
/// <summary>
/// 從鏈表類(lèi)的某節(jié)點(diǎn)之后插入新節(jié)點(diǎn)node.
/// </summary>
/// <param name="_key" type="String">
/// 在鍵值等于_key的元素之后插入
/// </param>
/// <param name="node" type="Object">
/// 要插入的元素 www.dhdzp.com
/// </param>
var i = this.root;
while (Boolean(i = i.next))
{
if (i.next.Key == _key)
{
var tmp = i.next;
i.next = node;
node.next = tmp;
break;
}
}
},
remove: function (_key)
{
/// <summary>
/// 從鏈表類(lèi)中移除一個(gè)key
/// </summary>
/// <param name="_key" type="String">
/// key的值
/// </param>
var i = this.root;
do
{
if (i.next.Key == _key)
{
if (i.next.next == null)
this.end = i;
i.next = i.next.next;
this.count--;
return;
}
} while (Boolean(i = i.next))
},
exists: function (_key)
{
/// <summary>
/// 檢查鏈表類(lèi)中是否存在一個(gè)key
/// </summary>
/// <param name="_key" type="String">
/// key的值
/// </param>
/// <returns type="Boolean">
/// </returns>
var i = this.root;
while (Boolean(i = i.next))
if (i.Key == _key)
return true;
return false;
},
removeAll: function ()
{
/// <summary>
/// 清空鏈表類(lèi)
/// </summary>
this.root = new linkNode(null, null);
this.end = this.root;
this.count = 0;
},
Obj2str: function (o)
{
if (o == undefined)
{
return "";
}
var r = [];
if (typeof o == "string")
return "\"" + o.replace(/([\"\\])/g, "\\$1").replace(/(\n)/g, "\\n").replace(/(\r)/g, "\\r").replace(/(\t)/g, "\\t") + "\"";
if (typeof o == "object")
{
if (!o.sort)
{
for (var i in o)
r.push("\"" + i + "\":" + this.Obj2str(o[i]));
r = "{" + r.join() + "}";
}
else
{
for (var i = 0; i < o.length; i++)
r.push(this.Obj2str(o[i]))
r = "[" + r.join() + "]";
}
return r;
}
return o.toString().replace(/\"\:/g, '":""');
},
getJSON: function ()
{
/// <summary>
/// 轉(zhuǎn)換成JSON字符串
/// </summary>
/// <returns type="String">
/// </returns>
//內(nèi)部方法,用于遞歸
var me = this;
var getChild = function (node)
{
var str = "";
str += "{\"Key\":\"" + node.Key + "\",\"Value\":" + me.Obj2str(node.Value);
if (node.next != null)
str += ",\"next\":" + getChild(node.next);
else
str += ",\"next\":\"null\"";
str += "}";
return str;
};
var link = "{\"root\":{\"Key\":\"null\",\"Value\":\"null\",\"next\":";
if (this.count == 0)//如果空表
{
return "{\"root\":{\"Key\":\"null\",\"Value\":\"null\",\"next\":\"null\"},\"end\":{\"Key\":\"null\",\"Value\":\"null\",\"next\":\"null\"},\"count\":\"0\"}";
}
link += getChild(this.root.next) + "}";
//加上end
link += ",\"end\":{\"Key\":\"" + this.end.Key + "\",\"Value\":" + me.Obj2str(this.end.Value) + ",\"next\":\"null\"";
link += "},\"count\":\"" + this.count + "\"}";
return link;
},
getArrayJSON: function ()
{
/// <summary>
/// 轉(zhuǎn)所有節(jié)點(diǎn)的value換成JSON字符串,數(shù)組格式
/// </summary>
/// <returns type="String">
/// </returns>
var link = "{\"link\":[";
var i = this.root;
while (Boolean(i = i.next))
{
link += this.Obj2str(i.Value) + ",";
}
link = link.substr(0, link.length - 1);
link += "]}";
return link;
},
sort: function (fn)
{
/// <summary>
/// 對(duì)鏈表進(jìn)行排序
/// </summary>
/// <param name="fn" type="Function">
/// 比較兩個(gè)鏈表元素大小的方法,當(dāng)返回真時(shí),此方法的參數(shù)所指的節(jié)點(diǎn)將往下沉
/// </param>
if (fn != null)
{
var i = this.root;
while (Boolean(i = i.next))
{
var j = this.root;
while (Boolean(j = j.next))
{
if (j.next != null)
{
if (fn.call(this, j))
{
var Key = j.Key;
var Value = j.Value;
j.Key = j.next.Key;
j.Value = j.next.Value;
j.next.Key = Key;
j.next.Value = Value;
}
}
}
this.end = i;
}
}
else
{
}
}
};
- JavaScript 雙向鏈表操作實(shí)例分析【創(chuàng)建、增加、查找、刪除等】
- JavaScript將數(shù)組轉(zhuǎn)換為鏈表的方法
- JS中的算法與數(shù)據(jù)結(jié)構(gòu)之鏈表(Linked-list)實(shí)例詳解
- JS實(shí)現(xiàn)的合并兩個(gè)有序鏈表算法示例
- 使用JavaScript實(shí)現(xiàn)鏈表的數(shù)據(jù)結(jié)構(gòu)的代碼
- JavaScript數(shù)據(jù)結(jié)構(gòu)之鏈表的實(shí)現(xiàn)
- javascript循環(huán)鏈表之約瑟夫環(huán)的實(shí)現(xiàn)方法
- JavaScript實(shí)現(xiàn)鏈表插入排序和鏈表歸并排序
- JS使用單鏈表統(tǒng)計(jì)英語(yǔ)單詞出現(xiàn)次數(shù)
- JavaScript封裝單向鏈表的示例代碼
相關(guān)文章
Jquery實(shí)現(xiàn)的tab效果可以指定默認(rèn)顯示第幾頁(yè)
tab效果想必大家在網(wǎng)上都有見(jiàn)過(guò)很多吧,在本文將為大家介紹下如何實(shí)現(xiàn)可以在代碼里面指定默認(rèn)顯示第幾頁(yè)的tab效果,感興趣的朋友不要錯(cuò)過(guò)2013-10-10
解決layui上傳文件提示上傳異常,實(shí)際文件已經(jīng)上傳成功的問(wèn)題
今天小編就為大家分享一篇解決layui上傳文件提示上傳異常,實(shí)際文件已經(jīng)上傳成功的問(wèn)題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
javascript實(shí)現(xiàn)在線(xiàn)客服效果
這篇文章主要介紹了javascript實(shí)現(xiàn)在線(xiàn)客服效果的實(shí)例代碼,非常不錯(cuò),這里推薦給大家,有需要的小伙伴可以參考下。2015-07-07
淺談nodeName,nodeValue,nodeType,typeof 的區(qū)別
本文主要簡(jiǎn)單介紹了nodeName,nodeValue,nodeType,typeof 的區(qū)別,算是知識(shí)點(diǎn)的一個(gè)小總結(jié),希望對(duì)小伙伴們有所幫助2015-01-01
JS實(shí)現(xiàn)模仿微博發(fā)布效果實(shí)例代碼
這篇文章主要介紹了JS實(shí)現(xiàn)模仿微博發(fā)布效果實(shí)例代碼,有需要的朋友可以參考一下2013-12-12
JS獲取當(dāng)前時(shí)間的年月日時(shí)分秒及時(shí)間的格式化的方法
這篇文章主要介紹了js獲取當(dāng)前時(shí)間的年月日時(shí)分秒及時(shí)間的格式化,本文通過(guò)實(shí)例代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
淺談js的ajax的異步和同步請(qǐng)求的問(wèn)題
下面小編就為大家?guī)?lái)一篇淺談js的ajax的異步和同步請(qǐng)求的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10

