8-链表练习-LeetCode203移除链表元素

时间:2021-12-14 01:09:39

题目

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点 。

示例 1:

8-链表练习-LeetCode203移除链表元素

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

示例 2:

输入:head = [], val = 1
输出:[]

示例 3:

输入:head = [7,7,7,7], val = 7
输出:[]

提示:

列表中的节点数目在范围 [0, 10^4] 内

1 <= Node.val <= 50

0 <= val <= 50


思路1

无虚拟头节点,分情况判断边界条件:

  1. 头节点不为空,且头节点就是待删除节点:直接删除头节点。
  2. 头节点为空:直接返回空。
  3. 头节点不为空,且头节点不是待删除节点:先要找到待删除节点的前驱节点,再进行删除。

代码1

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
 
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        //先判断边界条件
        //头节点不为空,且头节点就是待删除节点
        while(head != null && head.val == val) { //一定要用while,可能出现连续多个头节点都是待删除节点的情况。此处一定是先判空,再判断值是否相等
            ListNode node = head;
            head = head.next;
            node.next = null;
        }

        //头节点为空
        if(head == null) {
            return null;
        } else { //头节点不为空,且头节点不是待删除节点
            //从头开始寻找值为val的节点
            ListNode prev = head;
            while(prev.next != null) {
                if(prev.next.val == val) {
                    //node就是待删除的节点
                    ListNode node = prev.next;
                    prev.next = node.next;
                    node.next = null;
                } else {
                    prev = prev.next;
                }
            }
            return head;
        }
    }
}

思路2

采用虚拟头节点法。


代码2

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;
        ListNode prev = dummyHead;

        while(prev.next != null) {
            if(prev.next.val == val) {
                ListNode node = prev.next;
                prev.next = node.next;
                node.next = null;
            } else {
                prev = prev.next;
            }
        }
        
        return dummyHead.next; //不能是return head
    }
}

思路3

采用递归法。


代码3

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if(head == null) {
            return null;
        }
        head.next = removeElements(head.next, val); //这一行只能放在中间位置,不能放在最后一行
        return head.val == val ? head.next : head;
    }
}