1、运用单指针删除
把下一个节点的值赋给当前要删除的节点
当前节点指向下下个节点
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} node
* @return {void} Do not return anything, modify node in-place instead.
*/
var deleteNode = function(node) {
node.val = node.next.val
node.next = node.next.next
};
2、运用哨兵节点删除
这个的可扩展性很好,比如要返回head,可以先把head保存起来,最后return即可。
不用考虑删除的节点是否是头节点
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} data
* @return {Boolean}
*/
LinkedList.prototype.remove = function(head,data){
let pre = new Node(-1) // 哨兵节点
pre.next = head
while(pre.next){
if(pre.next.data===data){
pre.next = pre.next.next
break
}
pre = pre.next
}
return true
}
3、运用双指针删除
这种方式存在一个问题:当你的链表只有一个节点的时候,就不可以删除。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {String/Number} data
* @return {Boolean}
*/
LinkedList.prototype.remove = function(head,data){
let current = head
let previous = null
while (current) {
if(current.data === data){
previous.next = current.next
break
}
previous = current
current = current.next
}
return true
}