0
点赞
收藏
分享

微信扫一扫

LeetCode动态图解---203.移除链表元素

扬帆远航_df7c 2022-04-23 阅读 136

题目:

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

思路:

①单链表中只有头节点没有前驱,投机欸但需要额外处理;若头节点就是待删除节点,就是用while判断,这里是因为删除后的新的头节点还有可能是待删除的节点。

这里还有一个要注意的点,while循环的判断条件不能 (head.val == val && head != null),因为循环中的 head.val == val 可能为NULL ,此时就会出现空指针异常!!!

while (head != null && head.val == val) {
            head = head.next;
        }

②还要进行特殊情况的判断:链表中全部元素都是要删除的情况

if (head == null) {
            return null;
        }

③Node.prev = head,把头节点赋给指针prev。

从头结点开始,prev一定不是待删除的节点,因为如果第一个是要删除的,那么会导致prev永远删不掉。

这样情况下,因为prev一定不是待删除的节点,那么我们只需从prev后面一个节点开始判断是否删除,prev.next.val = val ,这样就可以得出循环结束的条件为:prev.next != null 。

这样只有 prev.next 不是待删除的节点的时候,指针prev才会向后移 prev = prev.next。

总上所述动态图为:

代码为:

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

相关推荐

0 条评论