LeetCode No.203 删除链表中等于给定值 val 的所有节点 (Java)

版权声明:本文为匆忙拥挤repeat(stone)原创文章,转载请注明出处 —— http://blog.csdn.net/jjwwmlp456 https://blog.csdn.net/jjwwmlp456/article/details/85258151

问题

删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

给定的 ListNode:

public static class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(val + "->");
        ListNode p = next;
        while (p != null) {
            sb.append(p.val + "->");
            p = p.next;
        }
        return sb.toString();
    }
}

解一

直接遍历,先处理头节点,再处理非头节点

public static ListNode removeElements(ListNode head, int val) {
    //头结点相匹配 删除
    while (head != null && head.val == val) {
//            ListNode delNode = head;
        head = head.next;
//            delNode = null;   //方法体执行完后,java 有自己的垃圾回收机制;可以不处理
    }
    if (head == null) {
        return null;
    }

    //非头结点
    ListNode p = head;
    while (p.next != null) {
        if (p.next.val == val) {
//                ListNode delNode = p.next;
//                p.next = delNode.next;
//                delNode = null; //方法体执行完后,java 有自己的垃圾回收机制;可以不处理
            p.next = p.next.next;
        } else {
            p = p.next;
        }
    }
    return head;
}

解二

使用虚拟头结点; 不需要对头结点做处理

public static ListNode removeElements2(ListNode head, int val) {
    ListNode dummyHead = new ListNode(-1);
    dummyHead.next = head;
    ListNode p = dummyHead;
    while (p.next != null) {
        if (p.next.val == val) {
            p.next = p.next.next;
        } else {
            p = p.next;
        }
    }
    return dummyHead.next;
}

解三

使用递归。

public static ListNode removeElements3(ListNode head, int val) {
    if (head == null) return null;
    if (head.val == val) {//处理头结点
        head = head.next;
        head = removeElements3(head, val);
    } else {//处理非头结点
        if (head.next != null)
            head.next = removeElements3(head.next, val);
    }
    return head;
}

解四

与解三类似。递归中直接处理下个结点,最后才处理头结点

public static ListNode removeElements4(ListNode head, int val) {
    if (head == null) return null;
//        ListNode result = removeElements4(head.next, val);
//        if (head.val == val) {
//            return result;
//        } else {
//            head.next = result;
//            return head;
//        }

    head.next = removeElements4(head.next, val);
    if (head.val == val) {
        head = head.next;
    }
    return head;
}

猜你喜欢

转载自blog.csdn.net/jjwwmlp456/article/details/85258151