每個結點包含三部分,指向前乙個結點的指標(pre),指向後乙個節點的指標(next),以及自己的資料部分(element),於是我們就可以先寫出結點物件
function node
:定義結點物件
function
node
(element)
然後我們開始實現插入鍊錶的演算法
(宣告)下面函式中的this是我們最後初始化鍊錶的例項,這裡大家不要疑惑。可以拉到最下面我們初始化鍊錶那裡,相信你會明白呦
**`function insert`:插入節點**
function
insert
(newelement, currentelement)
if(currentnode.next !=
null
)else
}
function find
:找到插入位置
function
find
(element)
currentnode = currentnode.next
}return currentnode
}
接下來是移除結點的實現,如果看懂了插入節點的實現,那麼移除就會很簡單了,相信大家都可以很快明白,這裡就直接貼出實現**;
function remove
:移除乙個結點
function
remove
(element)
/*首先是不是頭尾節點的情況*/
if(currentnode.next !=
null
&& currentnode.previous !=
null
)else
if(currentnode.previous ==
null
)else
if(currentnode.next ==
null
)}
截止到這裡我們基本功能已經有了,下面使我們根據自己需要可以自定義一些其他函式function lastnode
:找到最後乙個節點
function
lastnode()
return head //這裡head在尾節點的位置
}
function
(element)
function showlist
:將鍊錶所有的結點列印出來
function
showlist()
while
(head !=
null
)// 大家可以看一下下面注釋內容存在什麼問題,留給大家思考一下
// while (head.next != null)
}
接下來是對鍊錶進行初始化,這也是上述函式中所有this
所代表的例項function initlist
:初始化鍊錶,並將所有方法註冊到鍊錶中
function
initlist()
var list =
newinitlist()
list.
insert
('two'
,'one'
)list.
insert
('four'
,'two'
)list.
insert
('three'
,'two'
)// console.log(list.head.next)
list.
showlist()
list.
('a'
)list.
('b'
)list.
insert
('b2'
,'b'
)list.
showlist()
console.
log(list.
lastnode()
)// list.remove('one')
// list.showlist()
console.
log(list.
find
('a'
).previous)
// console.log(list.find('four').previous)
// console.log(list.head.element)
下面是執行結果:
function
node
(element)
function
find
(element)
currentnode = currentnode.next
}return currentnode
}function
insert
(newelement, currentelement)
if(currentnode.next !=
null
)else
}function
remove
(element)
/*首先是不是頭尾節點的情況*/
if(currentnode.next !=
null
&& currentnode.previous !=
null
)else
if(currentnode.previous ==
null
)else
if(currentnode.next ==
null)}
function
showlist()
while
(head !=
null
)// while (head.next != null)
}function
initlist()
function
(element)
function
lastnode()
return head
}var list =
newinitlist()
list.
insert
('two'
,'one'
)list.
insert
('four'
,'two'
)list.
insert
('three'
,'two'
)// console.log(list.head.next)
list.
showlist()
list.
('a'
)list.
('b'
)list.
insert
('b2'
,'b'
)list.
showlist()
console.
log(list.
lastnode()
)// list.remove('one')
// list.showlist()
console.
log(list.
find
('a'
).previous)
// console.log(list.find('four').previous)
// console.log(list.head.element)
JS實現雙向鍊錶
js實現雙向鍊錶 function doublylinkedlist var length 0,head null 向尾部追加 element else previous.next node node.prev previous length return true 指定位置插入 this.inse...
JS實現單向鍊錶 雙向鍊錶 迴圈鍊錶
鍊錶儲存有序的元素的集合,但是和陣列不同的是,鍊錶中的元素在記憶體中的儲存並不是連續的。每乙個鍊錶元素都包含了乙個儲存元素本身的節點和乙個指向下乙個元素的引用。看起來就像這樣 相對於傳統的陣列,鍊錶的乙個好處就是增刪的時候無需移動其它元素,只要更改指標的指向就可以了。但是缺點就是如果想要訪問鍊錶中的...
JS 雙向鍊錶
雙向鍊錶 雙向鍊錶 單鏈表只能從頭節點開始訪問鍊錶中的資料元素,如果需要逆序訪問單鏈表中的資料元素將極其低效。從鍊錶的頭節點遍歷到尾節點很簡單,但反過來從後向前遍歷則沒那麼簡單。通過給node物件增加乙個屬性,該屬性儲存指向前驅節點的鏈結,這樣就容易多了。此時,向鍊錶插入乙個節點需更多的工作,需指出...