JS之單向連結串列反轉
阿新 • • 發佈:2021-02-07
JS之單向連結串列反轉
淺談單向連結串列
連結串列是一種資料結構,在記憶體地址中可以是不連續的,這也是連結串列和陣列的區別之一。單向的意思就是連結串列的每一個節點都只有一個next指標,指向下一個節點,對比雙向連結串列,它少了prev指標,指向上一個節點,因為節點與節點之間是用指標連線,所以記憶體地址可以是不連續的。
構建Node節點類
我們知道連結串列是由多個節點組成的,每個節點都有資料和next指標,下面我們就構建一個Node類:
class Node{
constructor (data_) {
//data的型別:{id: 'xxx', code: 'xxx'}
this.data = data_;
//這裡next預設指向空
this.next = null;
}
}
構建List連結串列類
有了Node類,就可以構建List類了,List類的欄位只需要一個header頭指標就夠了,下面實現List類一些常用的方法和反轉功能,重要的地方會在程式碼中註釋。
class List {
constuctor(head) {
//初始化的時候,將頭指標指向頭節點
this.header = head;
}
each(cb) {
//這裡使用區域性變數,拿到連結串列的頭節點
//其作用是用來遍歷連結串列,之後有很多相同操作不在贅述
let p = this.header;
while(p) {
cb(p);
//這裡的是將p指向它的下一個節點,達到遍歷的目的
p = p.next;
}
}
log() {
this.each((node) => {
console.log('data', node.data);
})
}
length_() {
let count = 0;
this.each((node) => {
count++;
})
return count;
}
add(node) {
let p = this.header;
//遍歷連結串列中所有節點,直到找到最後一個節點
while(p.next) {
p = p.next;
}
p.next = node;
}
//反轉的意思其實就是指標從指向下一個節點變為指向上一個節點
//頭節點和尾節點調換
//需要注意的是尾節點的next指標一定指向null,否指就會形成閉環
//我的思路是用p、q、r三個指標分別指向三個節點,每一次迴圈
//都將q的next指標指回p,當q不存在時,p為尾節點
revert() {
let p = this.header;
let q = p.next;
while(q) {
//r指標的作用是儲存p的next節點
let r = q.next;
q.next = p;
p = q;
q = r;
}
//此時header實際上是指向尾節點,所以將其next指向空
this.header.next = null;
//此時的p是原來連結串列的尾節點,反轉後尾節點變為頭節點
this.header = p;
}
}
總結
學習連結串列不僅可以幫助我們提高面試的能力,重要的是提升熟悉使用指標的能力,這裡我只是實現了連結串列最基礎簡單的一些功能和我自己的一些理解,希望大家多多指正和評價,謝謝!