色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

javascript 變量雙向鏈表

李中冰1年前8瀏覽0評論

在JavaScript中,我們常常需要使用鏈表來存儲數據,而雙向鏈表則是一種十分常用的數據結構。所謂雙向鏈表,就是每個節點不僅有一個前驅節點,還有一個后繼節點。這樣可以讓我們輕松地從頭到尾或從尾到頭遍歷整個鏈表。

比如,我們可以使用以下的代碼定義一個雙向鏈表的節點:

class DoubleLinkedListNode {
constructor(value) {
this.value = value;
this.prev = null;
this.next = null;
}
}

這里,我們使用了ES6中的class語法來定義一個節點類,每個節點有一個value屬性表示存儲的值,prev屬性指向前驅節點,next屬性指向后繼節點。

接下來,我們可以定義一個雙向鏈表類,它可以包含多個節點,并且可以進行一些基本的操作,比如在某個位置插入或刪除節點。

class DoubleLinkedList {
constructor() {
this.head = null;
this.tail = null;
this.length = 0;
}
push(value) {
const node = new DoubleLinkedListNode(value);
if (!this.head) {
this.head = node;
this.tail = node;
} else {
this.tail.next = node;
node.prev = this.tail;
this.tail = node;
}
this.length++;
}
insert(value, position) {
if (position< 0 || position >this.length) {
return false;
}
const node = new DoubleLinkedListNode(value);
if (position === 0) {
if (!this.head) {
this.head = node;
this.tail = node;
} else {
node.next = this.head;
this.head.prev = node;
this.head = node;
}
} else if (position === this.length) {
this.tail.next = node;
node.prev = this.tail;
this.tail = node;
} else {
let current = this.head;
for (let i = 0; i< position; i++) {
current = current.next;
}
node.next = current;
node.prev = current.prev;
current.prev.next = node;
current.prev = node;
}
this.length++;
return true;
}
remove(position) {
if (position< 0 || position >= this.length) {
return false;
}
if (this.length === 1) {
this.head = null;
this.tail = null;
} else if (position === 0) {
this.head = this.head.next;
this.head.prev = null;
} else if (position === this.length - 1) {
this.tail = this.tail.prev;
this.tail.next = null;
} else {
let current = this.head;
for (let i = 0; i< position; i++) {
current = current.next;
}
current.prev.next = current.next;
current.next.prev = current.prev;
}
this.length--;
return true;
}
}

以上代碼定義了一個雙向鏈表類DoubleLinkedList,它包含了三個屬性:head表示鏈表的頭節點,tail表示鏈表的尾節點,length表示鏈表的長度。在這個類中,我們定義了三個方法:push、insert和remove,用于在鏈表中增加、插入或刪除節點。

這里,我們用了一些技巧來處理邊界情況。比如,當鏈表為空時,在插入或刪除節點時需要特殊處理;在插入或刪除節點時,如果位置不合法,則直接返回false。這些細節都需要仔細地思考和處理。

除了以上的基本操作,我們還可以對雙向鏈表進行其他的操作。比如,我們可以實現一個forEach方法,用于按順序遍歷鏈表并對每個節點進行操作:

class DoubleLinkedList {
// ...
forEach(fn) {
let current = this.head;
while (current) {
fn(current.value);
current = current.next;
}
}
}
const list = new DoubleLinkedList();
list.push(1);
list.push(2);
list.push(3);
list.forEach(value =>{
console.log(value);
});

在以上代碼中,我們定義了一個forEach方法,它接受一個函數fn作為參數,然后遍歷整個鏈表,對每個節點的值進行操作。我們可以將其用于輸出鏈表的內容。

最后,需要注意的是,JavaScript是一種動態類型語言,因此在使用變量時需要格外小心。特別要注意在使用變量時避免因名稱相同而導致沖突的問題。

總之,雙向鏈表是JavaScript中非常實用的數據結構之一,它可以用于存儲任意類型的數據,并且可以進行各種操作。學習和掌握雙向鏈表對于提高JavaScript編程技能非常有幫助。