大家都用過js中的陣列,陣列其實是一種線性表的順序儲存結構,它的特點是用一組位址連續的儲存單元依次儲存資料元素。而它的缺點也正是其特點而造成,比如對陣列做刪除或者插入的時候,可能需要移動大量的元素。
這裡大致模擬一下陣列的插入操作:
function insert(arr, index, data)
arr[index] = data;
}
從上面的**可以看出陣列的插入以及刪除都有可能會是乙個o(n)的操作。從而就引出了鍊錶這種資料結構,鍊錶不要求邏輯上相鄰的元素在物理位置上也相鄰,因此它沒有順序儲存結構所具有的缺點,當然它也失去了陣列在一塊連續空間內隨機訪問的優點。
單向鍊錶的特點:
鍊錶中的幾個主要操作
初始化節點
class node
}
初始化單向鍊錶class list
}
建立節點static createnode(key)
這裡說明一下,這一塊我是向外暴露了乙個靜態方法來建立節點,而並非直接把它封裝進插入操作裡去,因為我感覺這樣的邏輯會更加正確一些。 從建立乙個鍊錶 -> 建立乙個節點 -> 將節點插入進鍊表中。可能你會遇到一些文章介紹的方式是直接將乙個資料作為引數去呼叫insert操作,在insert內部做了乙個建立節點。
插入節點(插入到頭節點之後)
插入操作只需要去調整節點的指標即可,兩種情況:
head有指向的節點
insert(node) else
this.head = node;
}
find(key)
return node;
}
這裡分三種情況:
要刪除的節點為最後乙個節點
在列表中間刪除某個節點
delete(node)
// 查詢所要刪除節點的上乙個節點
let prevnode = this.head;
while (prevnode.next !== node)
// 第二種情況
if(node.next === null)
// 第三種情況
if(node.next)
}
class listnode
}class list
static createnode(key)
// 往頭部插入資料
insert(node) else
this.head = node;
this.length++;
} find(key)
return node;
} delete(node)
if (node === this.head)
let prevnode = this.head;
while (prevnode.next !== node)
if (node.next === null)
if (node.next)
this.length--;
}}
如果你把上面介紹的單向列表都看明白了,那麼這裡介紹的雙向列表其實差不多。
從上面的圖可以很清楚的看到雙向鍊錶和單向鍊錶的區別。雙向鍊錶多了乙個指向上乙個節點的指標。
初始化節點
class listnode
初始化雙向鍊錶class list
}
建立節點static createnode(key)
插入節點((插入到頭節點之後)insert(node)
this.head = node;
}
搜尋節點
這裡和單向節點一樣,就直接貼**了
search(key)
return node;
}
刪除節點
和之前單向鍊錶一樣,分三種情況去看:
刪除的是中間的某個節點
刪除的是最後乙個節點
* 雙向鍊錶
*/class list
static createnode(key)
insert(node)
this.head = node;
} search(key)
return node;
} delete(node) = node;
delete node.prev;
delete node.next;
if (node === this.head)
if (prev)
if (next)
}}這裡做乙個小總結吧,可能有一部分人讀到這裡還不是特別的明白,我的建議是先好好看懂上面的單向鍊錶。 其實只要你明白了鍊錶的基礎概念,就是有乙個head,然後在有好多的節點(node),然後用乙個指標把他們串起來就好了,至於裡面的插入操作也好,刪除也好,其實都是在調整節點中指標的指向。
js資料結構 鍊錶
大家都用過js中的陣列,陣列其實是一種線性表的順序儲存結構,它的特點是用一組位址連續的儲存單元依次儲存資料元素。而它的缺點也正是其特點而造成,比如對陣列做刪除或者插入的時候,可能需要移動大量的元素。這裡大致模擬一下陣列的插入操作 function insert arr,index,data arr ...
JS實現鍊錶資料結構
鍊錶儲存有序的元素集合,但不同於陣列,鍊錶中的元素在記憶體中並不是連續放置的。每個元素由乙個儲存元素本身的節點和乙個指向下乙個元素的引用 指標或鏈結 組成。鍊錶的乙個好處在於,新增或者移除元素的時候不需要移動其他的元素。然而鍊錶需要使用指標。陣列可以直接訪問任何位置的元素,而鍊錶想要訪問中間的乙個元...
JS資料結構學習 鍊錶
在儲存多個元素時,我們最常用的資料結構可能是陣列,究其原因可能是陣列訪問方便,可以直接通過訪問,但是陣列也存在一定的缺點,陣列的大小是固定,陣列在執行插入或者刪除的時候成本很高。鍊錶儲存的是有序的元素集合,和陣列不同的是,鍊錶中的元素在記憶體並不是連續放置,每個元素由乙個儲存元素本身的節點和乙個指向...