功能
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 } } }