删除链表中等于给定值 val 的所有节点--Java版

示例:

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

方法一:暴力求解

思路: 最容易想到的是遍历链表,将数据域为val的节点删除。但是,单链表一涉及删除,那么就得找到待删除节点的前驱节点,然而第一个节点没有前驱节点,当val恰为第一个节点的数据域时,这时就要做出不同的操作。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        //给定值恰好为头节点,一个if就行的事,为什么用while循环?
        //假设,前几个节点的数据域为val,或者整个链表节点的数据域为val时,这时就会用到while循环了
        while (head != null && head.val == val) {
            head = head.next;
        }
        /*
        此时有两种情况
        	1:前几个节点的数据域为val,删除了指定节点后,留下了待删除节点均有前驱节点的链表
        		例如: 1->1->1->2->6->3->4->1->6, val = 1--->  2->6->3->4->1->6 
        	2:整个链表的数据域为val,被删除完毕
        */
        if (head == null) {//处理第2种情况
            return null;
        }
        //处理第1种情况
        ListNode prev = head;//前驱节点
        //while循环的出口初学者不好确定,记住谁待删除,就找谁
        while (prev.next != null){
            if (prev.next.val == val) {
                prev.next = prev.next.next;
            }else{
                prev = prev.next;
            }
        }
        return head;
    }
}
方法二:虚拟头节点

思路: 既然知道删除没有头节点的节点需要用别的方法,那么创建一个虚拟头节点,使所有节点都有头节点,就可以用同一种方法解决了。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        //创建一个虚拟头节点,数据域象征性给-1
        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;
        //此时链表中所有节点都有前驱节点
        ListNode prev = dummyHead;
        while (prev.next != null) {
            if (prev.next.val == val) {
                prev.next = prev.next.next;
            } else {
                prev = prev.next;
            }
        }
        return dummyHead.next;
    }
}
方法三:递归

思路: 将一个链表看为head,和head.next两部分,先删除head.next链表中等于给定值 val 的所有节点后,在判断head节点是否要被删除。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
       //head要找到head.next则head必须不为空,所有先排除head为空的情况
       if (head == null) {
           return null;
       }
        head.next = removeElements(head.next,val);
        return head.val == val?head.next:head;
    }
}

你可能感兴趣的:(数据结构与算法--Java版)