剑指 Offer 18. 删除链表的节点

该算法详细描述了如何在单链表中删除指定值的节点。首先进行特判,如果头节点就是要删除的节点,则直接返回头节点的下一个节点。接着初始化两个指针p和q,分别指向头节点和头节点的下一个节点。在循环中,同步移动p和q,直到找到要删除的节点(q指向的节点值等于给定值)。然后更新p的next为q的下一个节点,从而删除q节点。最后返回头节点。整个过程的时间复杂度为O(n),空间复杂度为O(1)。
摘要由CSDN通过智能技术生成

算法思路:

  1. 特判:如果头节点就是要删除的节点,直接返回头节点的下一个节点。
  2. 初始化指针p和q,p指向头节点,q指向头节点的下一个节点。
  3. 循环遍历,直到q指向要删除的节点或者q为空。
  4. p和q同步前进。
  5. p的next指向q的下一个节点,实现删除q节点。
  6. 返回头节点。
    时间复杂度:O(n),空间复杂度:O(1)。
/**
 * Definition for singly-linked list. 
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteNode(ListNode head, int val) {
        //特判:如果头节点就是要删除的节点,直接返回头节点的下一个节点
        if (head.val == val){                   
            return head.next;                  
        }  
        //初始化指针p和q,p指向头节点,q指向头节点的下一个节点
        ListNode p = head,q = head.next;   
        //循环遍历,直到q指向要删除的节点或者q为空
        while (q != null && q.val != val){     
            //p和q同步前进    
            p = p.next;
            q = q.next;
            if (q == null) return head;
            //如果链表中没有值等于val的节点,q会遍历到链表尾部,变为null。
            //在这种情况下,p.next = q.next这一行代码会导致NullPointerException。
            //因为当q变为null时,q.next也是null,我们无法对其进行赋值操作        
        }
        //p的next指向q的下一个节点,实现删除q节点
        p.next = q.next;                      
        //返回头节点
        return head;                           
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值