/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} val
* @return {ListNode}
*/
var removeElements = function(head, val) {
// 设置虚拟头节点
let dummyHead = new ListNode(0, head);
// 保存头结点的下一个节点的指针
let cur = dummyHead;
while(cur.next) {
// 需要删除哪一个节点,需要知道前面的节点,和后面节点
if (cur.next.val === val) {
// 如果是目标值,当前节点的下一个指针直接指向下下个节点,当前节点的下一节点因为没有被引用,就会被GC回收,打到一个移除节点元素的效果
cur.next = cur.next.next;
continue;
}
cur = cur.next;
}
// 返回创建的虚拟链表的头结点的下一个指针
return dummyHead.next;
}
class LinkNode {
constructor(val, next) {
this.val = val;
this.next = next;
}
}
var MyLinkedList = function () {
this.data = null;
this.size = 0;
};
/**
* @param {number} index
* @return {number}
*/
MyLinkedList.prototype.getNode = function (index) {
if(index < 0 || index > this.size - 1) {
return -1;
}
let cur = new LinkNode(0, this.data);
while(index-- >= 0) {
cur = cur.next;
}
return cur;
};
/**
* @param {number} index
* @return {number}
*/
MyLinkedList.prototype.get = function (index) {
let cur = this.getNode(index);
// 如果直接判断val可能会存在0的情况,在JS中0是会转义成false
return cur.val != undefined ? cur.val : -1;
};
/**
* @param {number} val
* @return {void}
*/
MyLinkedList.prototype.addAtHead = function (val) {
// 制造一个虚拟头结点,下一节点指向当前实例节点
let dummyHead = new LinkNode(val, this.data);
// 当前实例节点更新为创建出来的节点
this.data = dummyHead;
this.size ++;
};
/**
* @param {number} val
* @return {void}
*/
MyLinkedList.prototype.addAtTail = function (val) {
let cur = this.data;
let dummyHead = new LinkNode(val, null);
if (!cur) {
this.data = dummyHead;
} else {
while(cur.next) {
cur = cur.next;
}
cur.next = dummyHead;
}
this.size++;
};
/**
* @param {number} index
* @param {number} val
* @return {void}
*/
MyLinkedList.prototype.addAtIndex = function (index, val) {
if (index > this.size) {
return -1;
}
if (index <= 0) {
this.addAtHead(val);
return;
}
if (index == this.size) {
this.addAtTail(val);
return;
}
// 实例出虚拟头结点
let dummyHead = new LinkNode(val, this.data);
let cur = this.getNode(index - 1);
// 虚拟节点下一针指向当前节点的下一个几点
dummyHead.next = cur.next;
// 更新当前节点的下一个指针为虚拟子节点,完成插入节点的操作
cur.next = dummyHead;
this.size++;
};
/**
* @param {number} index
* @return {void}
*/
MyLinkedList.prototype.deleteAtIndex = function (index) {
if (index < 0 || index > this.size - 1) {
return -1;
}
if (index == 0) {
let node = new LinkNode(0, this.data);
let cur = node;
cur.next = cur.next.next;
this.data = node.next;
this.size--;
return;
} else {
// 获取需要删除的节点的前一个节点
let cur = this.getNode(index - 1);
// 获取的节点的下一指针指向下下个节点
cur.next = cur.next.next;
this.size--;
return;
}
};
206. 反转链表 /**
-
@param {ListNode} head
-
@return {ListNode} */ var reverseList = function(head) { if (head && !head.next) { return head; }
let cur = head,pre = null, temp = null; while (cur) { // 保存当前节点下个节点的指向 temp = cur.next; // 改变当前节点下一指针指向上一个节点,实现反转 cur.next = pre; // 更新上一节点 pre = cur; // 更新当前节点,继续循环 cur = temp; } return pre; };