js实现单链表 题意:
在链表类中实现这些功能:
- get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
- addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
- addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
- addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
- deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
// 节点定义
class LinkNode {
constructor(val, next) {
this.val = val;
this.next = next;
}
}
// 单链表
var MyLinkedList = function () {
this._size = 0;
this._head = null;
this._tail = null;
};
/**
* @param {number} index
* @return {number}
*/
MyLinkedList.prototype.getNode = function (index) {
if (index >= this._size || index < 0) return null;
// let node = this._head;
let node = new LinkNode(0, this._head);
while (index-- >= 0) {
node = node.next;
}
return node;
};
/**
* @param {number} index
* @return {number}
*/
MyLinkedList.prototype.get = function (index) {
if (index >= this._size || index < 0) return -1;
return this.getNode(index).val;
// let node = this._head;
// while (index-- > 0) {
// node = node.next;
// }
// return node.val;
};
/**
* @param {number} val
* @return {void}
*/
MyLinkedList.prototype.addAtHead = function (val) {
/*
给头部添加节点
1. 创建节点,val 是要创建的值, next 就是当前头部的节点
2. 再把当前 _head 节点指向当前创建的 node
3. _size 加 1
4. 如果链表里面只有一个元素的话,还需要指定尾元素
*/
let node = new LinkNode(val, this._head);
this._head = node;
this._size++;
if (this._size === 1) {
this._tail = node;
}
};
/**
* @param {number} val
* @return {void}
*/
MyLinkedList.prototype.addAtTail = function (val) {
/*
给尾部添加
1. 创建节点,节点的 next 为 null
*/
let node = new LinkNode(val, null);
this._size++;
if (this._tail) {
this._tail.next = node;
this._tail = node;
return
}
this._tail = node;
this._head = node;
};
/**
* @param {number} index
* @param {number} val
* @return {void}
*/
MyLinkedList.prototype.addAtIndex = function (index, val) {
if (index > this._size || index < 0) return null;
if (index === 0) {
this.addAtHead(val);
} else if (index === this._size) {
this.addAtTail(val);
} else {
let findNode = this.getNode(index - 1);
let node = new LinkNode(val, findNode.next);
findNode.next = node;
this._size++;
}
};
/**
* @param {number} index
* @return {void}
*/
MyLinkedList.prototype.deleteAtIndex = function (index) {
if (index >= this._size || index < 0) return null;
if (index === 0) {
this._head = this._head.next;
// 如果删除的节点是尾节点
if (index == this._size - 1) {
this._tail = this._head;
}
} else {
let findNode = this.getNode(index - 1);
findNode.next = findNode.next.next;
// 处理末尾节点
if (index == this._size - 1) {
this._tail = findNode
}
}
this._size--;
};
/**
* Your MyLinkedList object will be instantiated and called as such:
* var obj = new MyLinkedList()
* var param_1 = obj.get(index)
* obj.addAtHead(val)
* obj.addAtTail(val)
* obj.addAtIndex(index,val)
* obj.deleteAtIndex(index)
*/
var obj = new MyLinkedList();
// obj.addAtHead('a');
// obj.addAtHead('b');
// obj.addAtHead('c');
obj.addAtTail(1);
// obj.addAtTail(2);
// obj.addAtIndex(-4, '你');
// obj.deleteAtIndex(2);
console.log('_head = ', obj._head)
console.log('_tail = ', obj._tail)
console.log('_size = ', obj._size)
// console.log(obj.get(0))
// obj.getAll();