数据结构---LeetCode链表使用(删除指定值的节点)

文章目录

      • 1. 题目
      • 2. 解法一: 先得到第一个不是需要删除的节点.
      • 3. 解法二:使用虚拟头节点, 不需要特殊处理头节点
      • 4. 解法三:使用递归

1. 题目

  1. 题目:删除链表中等于给定值 val 的所有节点。(LeetCode 203)
  2. 案例:
    输入: 1->2->6->3->4->5->6, val = 6
    输出: 1->2->3->4->5

2. 解法一: 先得到第一个不是需要删除的节点.

public ListNode removeElements(ListNode head, int val) {
    // 1. 可能存在一开始就是需要删除的节点
    while (head != null && head.val == val) {
        ListNode delNode = head;
        head = head.next;
        delNode.next = null; // delNode断开和链表的连接
    }

    // 经过第一步, 保证了val开头的所有节点全部删除
    if (head == null) {
        return null;
    }

    ListNode pre = head; // 此节点肯定不是val, 因此就得到了前一节点.
    while (pre.next != null) { 
    	// 可能一直都是需要删除的元素, 因此只有下一个节点不是需要删除的节点时, 才能移动位置
        if (pre.next.val == val) {
            ListNode delNode = pre.next;
            pre.next = delNode.next;
            delNode.next = null;
        } else {
            pre = pre.next;
        }
    }

    return head;
}

3. 解法二:使用虚拟头节点, 不需要特殊处理头节点

public ListNode removeElements(ListNode head, int val) {
    // 创建虚拟头节点.
    ListNode dummyHead = new ListNode(-1);
    dummyHead.next = head;

    ListNode pre = dummyHead;
    while (pre.next != null) {
        if (pre.next.val == val) {
            ListNode delNode = pre.next;
            pre.next = delNode.next;
            delNode.next = null;
        } else {
            pre = pre.next;
        }
    }

    return dummyHead.next;
}

4. 解法三:使用递归

public ListNode removeElements(ListNode head, int val) {
    if (head == null) {
        return null;
    }

    ListNode result = removeElements(head.next, val);
    /**
     * 回归的时候, 判断当前节点是否需要删除;
     * 需要删除, 即忽略当前节点; 返回以前的链表.
     * 不需要删除, 即把返回值链表, 拼接在当前节点的next上, 形成新的返回链表.
     */
    if (head.val == val) {
        return result;
    } else {
        head.next = result;
        return head;
    }
}

你可能感兴趣的:(数据结构和算法)