leetcode算法题目之移除链表元素(链表知识)

本文详细解析了如何在链表中删除所有等于给定值的节点,提供了两种解题思路:一种是直接处理头节点,另一种是利用虚拟头节点简化操作。通过具体示例和Java代码实现,加深对链表基础知识的理解。

过了一阵子,调整了自己,这篇博客是过完新年的第一篇博客,生活还要继续,继续奋斗;

今天这道题目其实不难,整道题目围绕的是链表的基础知识,请看题目的描述以及输入输出样例:

题目描述:删除链表中等于给定值 val 的所有节点。

示例:

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

解题思路:

可以看出这个样例是一个链表,我们只要匹配到节点值为val,并把此节点给删除即可

第一种方法:

1.我们将从head(头节点)开始遍历整个链表,如果头节点的值和val相同,那么就把头节点删除,在删除之前记得把head指向要删除的头节点的下一个节点,作为新的头节点;当然,在此过程中需要判断head是否为null(为null就直接返回null),也可能会出现整个链表中节点的值都和val相等,那么我们在删除头节点的操作外面加一层循环即可;

2.上面的步骤执行完毕后,如果发现此时的head不为空(head为null,证明了整个链表中节点的值都和val相等),也就意味着不是整个链表节点的值都和val相等,那么我们把此时的head作为头节点,从head.next进行遍历(因为此时的head节点的值必不可能和val相等),最后返回head即可

完成上述两个步骤之后即可解出这道题目:参考代码如下(Java):

 class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }
}

class Solution {
    public ListNode removeElements(ListNode head, int val) {

        //首先考虑头节点的只是否有和val相等的
        while (head != null && head.val == val) {
            ListNode delNode = head;
            head = head.next;
            delNode.next = null;
        }
        //如果整个链表节点的值都和val相同 则head为null
        if (head == null) {
            return null;
        }
        //接下来则从head下一个元素寻找(经过前面的条件筛选,head的值必不可能和val相等)
        ListNode prev = head;
        while (prev.next != null) {
            if (prev.next.val == val) {
                ListNode delNode = prev.next;
                prev.next = prev.next.next;
                delNode.next = null;
            } else {
                prev = prev.next;
            }
        }
        return head;

    }
}

 第二种方法:(虚拟头节点意思不明确的可以自行上网搜索知识点)

其实和第一种方法大致相同,但是更加简便明了,第一种方法没有使用虚拟的头节点,这次我们使用虚拟头节点来解出这一道题目

思路:和第一种思路有点区别,拥有了虚拟头节点,我们只要去遍历整个链表,删除掉节点值和val相等的节点即可;

参考代码如下:

 class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }
}

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 delNode = prev.next;
                prev.next = prev.next.next;
                delNode.next = null;
            } else {
                prev = prev.next;
            }
        }
        return dummyHead.next;

    }
}

总结一下:此道题目所围绕的知识就是链表的基础知识,第一种方法和第二种方法在于是否使用头节点,更加深一步的学习链表将在以后的博客进行更新,敬请期待!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弗兰随风小欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值