题目描述
解题思路
题目中提示这是个单链表,单链表的特征就是节点中有一个指向下一个节点的指针,如果要删除一个节点,直接这个节点的前一个节点指向它的下一个节点即可。跳过要删除的节点,这个节点就被删除了。JavaScript 中, 我们不用关心这个节点最后是否需要释放内存。
考虑三种情况:
-
如果头节点不存在,直接返回
-
如果头节点就是要删除的节点,直接将它的下一个节点返回。
-
遍历单链表,变量
cur为头节点- 如果
cur的下一个节点的val和 给定要删除的val值相等,则跳过该节点,将cur的next指针指向cur.next.next:cur.next = cur.next.next; - 否则,说明没有遇到要删除的节点,则直接将下一个节点复值给 cur 节点:
cur = cur.next完成遍历即可。当节点为null时即遍历结束。
注意:当找到要删除的值的时候,改变的是
cur的指针next, cur.next = cur.next.next, 而正常遍历的时候,cur是下一个节点cur = cur.next - 如果
代码
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} val
* @return {ListNode}
*/
var deleteNode = function(head, val) {
if(!head) return head;
if(head.val === val) return head.next;
let cur = head;
while(cur.next){
if(cur.next.val === val){
cur.next = cur.next.next;
}else{
cur = cur.next
}
}
return head;
};
总结
总的思路就是遍历,找到要删除的节点之后改变它的前一个元素的指针,让其指向它的后一个节点,然后需要考虑一下特殊情况,头节点不存在或者头节点的值就是要删除掉的节点的情况。
时间复杂度:O(n) 链表有 n 个, 进行了 n 次操作
空间复杂度:O(1)