JS中可以動態(tài)的向數(shù)組中添加刪除元素,所以不需要鏈表結(jié)構(gòu)。
鏈表特點:
- 添加、刪除元素很快,不需要進行移動。
- 單鏈表:每個元素都要保存一個指針,指向下一個元素。
- 雙鏈表:每個元素既要保存指向下一個元素的指針,還要保存指向上一個元素的指針。
- 循環(huán)鏈表:最后一個元素中保存指向第一個元素的指針。
1. 鏈表與數(shù)組區(qū)別:
1.數(shù)組:事先定義固定的長度,不能動態(tài)增減,會導(dǎo)致內(nèi)存浪費。
鏈表:可以動態(tài)分配內(nèi)存,動態(tài)增減,不會造成內(nèi)存浪費,方便得插入、刪除。
2.數(shù)組:順序存儲
鏈表:隨機存儲
3.數(shù)組:從棧中分配空間,方便快速,自由度小。
鏈表:從堆中分配空間,自由度大,申請管理麻煩。
4.數(shù)組:有越界問題。
鏈表:沒有越界問題。
2. 什么時候選擇順序表?什么時候選擇鏈表作為線性表得存儲結(jié)構(gòu)?
a.空間上:順序表靜態(tài)分配內(nèi)存,線性表動態(tài)分配內(nèi)存,如果長度變化不大,可以事先確定的用順序表,長度變化較大,事先無法確定的用鏈表。
b.時間上:如果在線性表上的操作主要為查找,很少刪除插入則用順序表;反之,則用鏈表。
3. 如何使用鏈表頭?
Paste_Image.png
頭節(jié)點的作用:
1.在插入和刪除結(jié)點時,需要修改前面結(jié)點的指針,如果沒有頭節(jié)點,則對開始結(jié)點前的插入刪除比較麻煩。
2.頭指針指向頭結(jié)點,保證空表與飛空表的處理是一樣的。
4. 如何實現(xiàn)單鏈表的插入、刪除?
插入:在ai之前插入一個元素x
1.找到ai-1的存儲位置P;
2.生成一個數(shù)據(jù)域為x的新節(jié)點;
3.將P的指針域指向新節(jié)點
4.新節(jié)點的指針域指向ai
主要的操作耗費在查找P位置,所以時間復(fù)雜度為O(n)
刪除:刪除ai
1.找到ai-1的存儲位置P;
2.將P指針域指向ai+1;
3.釋放ai結(jié)點空間。
function Node(element) {//結(jié)點定義
this.element=element;
this.next=null;
}
function LList() { //鏈表方法
this.head=new Node("head");
this.find=find;
this.insert=insert;
this.remove=remove;
this.findPrevious=findPrevious;
this.display=display;
}
function find(item) { //找到元素item
var currNode=this.head;
while(currNode.element!=item){
currNode=currNode.next;
}
return currNode;
}
function insert(newElement,item) {//向item后面插入newElement
var newNode=new Node(newElement);
var current=this.find(item);
newNode.next=current.next;
current.next=newNode;
}
function findPrevious(item) {//找到item前面的結(jié)點
var currNode=this.head;
while ((currNode.next!=null)&&(currNode.next.element!=item)){
currNode=currNode.next;
}
return currNode;
}
function remove(item) { //刪除元素值為Item的結(jié)點
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);
currNode=currNode.next;
}
console.log(currNode);
}
var cities=new LList();
cities.insert("A","head");
cities.insert("C","A");
cities.remove("C");
cities.display();