雙向鍊錶
雙向鍊錶
單鏈表只能從頭節點開始訪問鍊錶中的資料元素,如果需要逆序訪問單鏈表中的資料元素將極其低效。
從鍊錶的頭節點遍歷到尾節點很簡單,但反過來從後向前遍歷則沒那麼簡單。通過給node物件增加乙個屬性,該屬性儲存指向前驅節點的鏈結,這樣就容易多了。此時,向鍊錶插入乙個節點需更多的工作,需指出該節點正確的前驅和後驅。但從鍊錶中刪除節點時,效率提高了,無需再查詢待刪除節點的前驅節點。
雙向鍊錶
function node(element)
function llist()
function find(item)
return current;
}//雙向鍊錶的插入與單向鍊錶類似,但需設定新節點的prev屬性,使其指向該節點的前驅。
function insert(item,element)
// 雙向鍊錶的刪除比單向鍊錶效率更高,因為不需要再查詢前驅節點。
// 首先需要在鍊錶中找出儲存帶刪除資料的節點,然後設定該節點前驅的next屬性,使其指向待刪除節點的後繼。
// 設定該節點後繼的previous屬性,使其指向待刪除節點的前驅。
function remove(item)
}// 查詢最後的節點,同時避免從前往後遍歷鍊錶。
function findlast()
return current;
}// 以反序顯示鍊錶中元素
從雙向鍊錶中刪除元素
var ll = new llist();
ll.insert('head','conway');
ll.insert('conway','russellville');
ll.insert('russellville','alma');
ll.display();
print();
ll.remove('conway');
ll.display();
print();
ll.dispreverse();
在單向鍊錶中,如果迭代列表時錯過要找的元素,就需要回到列表起點,重新開始迭代。這就是雙向鍊錶的乙個優點。
function doublylinkedlist();
var length = 0;
var head = null;
var tail = null;
}
迭代列表直到到達要找的位置,將在current和previous元素之間插入新元素。首先,node.next將指向current,而previous.next將指向node,這樣就不會丟失節點之間的鏈結。然後需要處理所有的鏈結current.prev將指向node,而node.prev將指向previous。
this.insert = function(position,element)else
}else if(position === length)else
node.next = current;
previous.next = node;
current.prev = node;
node.prev = previous;
}length++;
return true;
}else
};
this.removeat = function(position)else
}else if(position === length-1)else
previous.next = current.next;
current.next.prev = previous;
}length--;
return current.element;
}else
};
JS實現雙向鍊錶
每個結點包含三部分,指向前乙個結點的指標 pre 指向後乙個節點的指標 next 以及自己的資料部分 element 於是我們就可以先寫出結點物件 function node 定義結點物件 function node element 然後我們開始實現插入鍊錶的演算法 宣告 下面函式中的this是我們...
JS實現雙向鍊錶
js實現雙向鍊錶 function doublylinkedlist var length 0,head null 向尾部追加 element else previous.next node node.prev previous length return true 指定位置插入 this.inse...
JS實現單向鍊錶 雙向鍊錶 迴圈鍊錶
鍊錶儲存有序的元素的集合,但是和陣列不同的是,鍊錶中的元素在記憶體中的儲存並不是連續的。每乙個鍊錶元素都包含了乙個儲存元素本身的節點和乙個指向下乙個元素的引用。看起來就像這樣 相對於傳統的陣列,鍊錶的乙個好處就是增刪的時候無需移動其它元素,只要更改指標的指向就可以了。但是缺點就是如果想要訪問鍊錶中的...