返回

解题日记:链表中的元素移除之道

见解分享

各位算法爱好者,今天我们共同踏上解题之旅,直面力扣经典题目 —— 203. 移除链表元素。

这道题目考察了链表的遍历和删除操作,需要我们灵活运用指针和迭代的方式巧妙解决。我们先来理清思路:

  1. 确认删除目标: 题目要求移除链表中指定 val 值的元素,因此我们需要遍历链表,逐一检查每个节点的值。
  2. 定位删除节点: 当发现目标节点时,我们需要定位它的前驱节点(即上一个节点),以便顺利删除。
  3. 执行删除操作: 通过前驱节点,我们可以便捷地修改指针指向,从而移除目标节点。

现在,我们开始动手编写代码:

public ListNode removeElements(ListNode head, int val) {
    // 特殊情况处理:如果头节点即为目标节点
    while (head != null && head.val == val) {
        head = head.next;
    }
    
    // 迭代链表,寻找目标节点
    ListNode current = head;
    ListNode prev = null;
    while (current != null) {
        // 发现目标节点,进行删除
        if (current.val == val) {
            if (prev == null) {  // 如果目标节点为头节点
                head = head.next;
            } else {  // 如果目标节点非头节点
                prev.next = current.next;
            }
        } else {
            prev = current;  // 记录前驱节点
        }
        current = current.next;  // 继续迭代
    }
    
    return head;
}

这段代码的运作流程如下:

  1. 首先,我们处理一个特殊情况:如果链表头节点的值就是 val ,我们需要将其删除并更新头节点。
  2. 然后,我们使用两个指针 currentprev 遍历链表。current 指向当前节点,prev 指向 current 的前驱节点。
  3. 遍历过程中,如果 current 节点的值等于 val ,则说明找到了目标节点。此时,根据目标节点的位置,我们进行不同的删除操作:
    • 如果目标节点是头节点(prev 为空),则直接更新头节点指向 current.next
    • 如果目标节点非头节点,则修改 prev 指向 current.next ,跳过目标节点。
  4. 如果 current 节点的值不等于 val ,则表示该节点不是目标节点,prev 指向 currentcurrent 继续向后遍历。

最后,遍历结束后,我们返回更新后的链表头节点 head