LeetCode算法题-Remove Linked List Elements(Java实现)

LeetCode算法题-Remove Linked List Elements(Java实现)

这是悦乐书的第189次更新,第191篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第48题(顺位题号是203)。移除单链表中节点值为val的节点。例如:

输入:1-> 2-> 6-> 3-> 4-> 5-> 6,val = 6
输出:1-> 2-> 3-> 4-> 5

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

特殊情况:当给定的链表中的节点值与val全都相等时,此时需要返回空。

正常情况:因为开始时就已经将链表判断了一遍,所以当进入下面的代码的时候,head节点的value肯定和val不相等。对此,我们在循环开始的时候,可以直接从head的下一个节点开始,如果head下一个节点的值和val相等,head下一个节点就需要指向其下下个节点。

public ListNode removeElements(ListNode head, int val) {
    while (head != null && head.val == val) {
        head = head.next;
    }
    if (head == null) {
        return head;
    }
    ListNode p = head;
    while (p.next != null) {
        if (p.next.val == val) {
            p.next = p.next.next;
        } else {
            p = p.next;
        }
    }
    return head;
}


03 第二种解法

此解法和第一种解法类似,但是不同的地方是将判断是否有相同节点值的循环换成了另外一种处理方式。因为核心的思路是判断节点值是否相等,但是循环是从head节点的下一个节点开始的,并不是从head开始,所以我们要在head节点的前面加上一个节点,让head节点变成第二节点,新节点变成我们需要循环处理的对象。在最后返回的时候,我们也是需要返回新节点的下一节点,也就是原来的head。

public ListNode removeElements2(ListNode head, int val) {
    ListNode res = new ListNode(0);
    res.next = head;
    ListNode pre = res;
    while (pre.next != null) {
        if (pre.next.val == val) {
            pre.next = pre.next.next;
        } else {
            pre = pre.next;
        }
        if(pre == null) break;
    }
    return res.next;
}


04 第三种解法

上面两种解法都是使用迭代的方法,此解法是使用递归的思路,先进入到链表的最后一位节点,然后反过来依次判断节点值是否相等,等于就跳到下一个节点,不等于就返回当前节点,来作为head的下一个节点。

public ListNode removeElements3(ListNode head, int val) {
    if (head == null) {
        return null;
    }
    head.next = removeElements3(head.next, val);
    if (head.val == val) {
        return head.next;
    } else {
        return head;
    }
}


05 小结

算法专题目前已连续日更超过一个月,算法题文章48+篇,