题链接:https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof/
利用双指针求解,第一个指向当前节点,第二个指向当前节点的上一个节点,找到要删除的节点,直接让第二个指针指向此节点的下一个节点即可。因为头节点也有可能被删除,所以要使用一个虚拟节点指向头节点,返回时只返回虚拟节点的下一个节点即可。
var deleteNode = function(head, val) {
if (head == null) {
return null;
}
//初始化一个虚拟节点
let preNode = new ListNode(-1);
//让虚拟节点指向头节点
preNode.next = head;
let resNode = preNode;
//遍历链表
while (head != null) {
if (head.val == val) {
//找到要删除的节点,便让此节点的前驱节点指向它的下一个节点
preNode.next = head.next;
break;
}
//没找到则往后移一步
preNode = head;
head = head.next;
}
//返回虚拟节点的下一个节点
return resNode.next;
};
设链表有n个节点:
时间复杂度:O(n)
空间复杂度:O(1)