功能
get(index):獲取鏈表中第 index 個節點的值。如果索引無效,則返回-1。
addAtHead(val):在鏈表的第一個元素之前添加一個值爲 val 的節點。插入後,新節點將成爲鏈表的第一個節點。
addAtTail(val):將值爲 val 的節點追加到鏈表的最後一個元素。
addAtIndex(index,val):在鏈表中的第 index 個節點之前添加值爲 val 的節點。如果 index 等於鏈表的長度,則該節點將附加到鏈表的末尾。如果 index 大於鏈表長度,則不會插入節點。
deleteAtIndex(index):如果索引 index 有效,則刪除鏈表中的第 index 個節點
代碼
思路: 使用object來構造層層遞進的單鏈表,如{ element: ‘1’, next: { element: ‘2’, next: null } }
// 數據形式:Node { element: ‘1’, next: { element: ‘2’, next: null } }
var MyLinkedList = function() {
this.head = null
this.len = 0
};
MyLinkedList.prototype.createNode = function(val) {
let nodeObj = {element: val, next: null}
return nodeObj
};
MyLinkedList.prototype.get = function(index) {
let tempNode = this.head
// 鏈表頭
if(index === 0 && this.len > 0) {
return tempNode.element
}
if(index >= this.len) {
return -1
}
// 獲取索引爲index的節點
for(let i = 0;i < index;i++) {
tempNode = tempNode.next
}
return tempNode.element
};
MyLinkedList.prototype.addAtHead = function(val) {
let node = this.createNode(val)
node.next = this.head
this.head = node
this.current = node
this.len++
};
MyLinkedList.prototype.addAtTail = function(val) {
let node = this.createNode(val)
let tempNode = this.head
while(tempNode.next) {
tempNode = tempNode.next
}
tempNode.next = node
this.len++
};
MyLinkedList.prototype.addAtIndex = function(index, val) {
let tempNode = this.head
let nextNode = null
let node = this.createNode(val)
if(index > this.len) {
return
}
// 鏈表頭
if(index === 0) {
// 鏈表頭添加
if(this.len === 0) {
this.head = node
} else {
// 非空鏈表
this.addAtHead(val)
}
this.len++
return
}
// 獲取index前的節點
for(let i = 0; i < index - 1;i++) {
tempNode = tempNode.next
}
nextNode = tempNode.next
node.next = nextNode
tempNode.next = node
this.len++
};
MyLinkedList.prototype.deleteAtIndex = function(index) {
if(index > 0 && index < this.len) {
let tempNode = this.head
// 獲取索引爲index-1的節點
for(let i = 1;i < index;i++) {
tempNode = tempNode.next
}
tempNode.next = tempNode.next.next
this.len--
}
// 鏈表頭
if(index === 0) {
this.head = this.head.next
this.len--
}
};
MyLinkedList.prototype.showLinkList = function() {
console.log(this.head)
}
// 調試
var linkList = new MyLinkedList()
linkList.addAtHead('1')
linkList.addAtIndex(1,'2')
linkList.addAtIndex(0,'3')
linkList.addAtTail('4')
linkList.addAtTail('5')
linkList.deleteAtIndex(2)
linkList.deleteAtIndex(0)
linkList.showLinkList()
console.log('索引爲2的元素: ',linkList.get(2))
結果:{ element: '1', next: { element: '4', next: { element: '5', next: null } } }