删除链表的节点(简单难度)

简介: 删除链表的节点(简单难度)

题目概述(简单难度)

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

示例 1:

2.png


输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]


示例 2:

输入:head = [], val = 1
输出:[]


示例 3:

输入:head = [7,7,7,7], val = 7
输出:[]


在此附上leetcode链接:

点击此处进入leetcode


思路与代码

思路展现

这道题目的思路是这样的:

1:首先定义两个指针变量cur和prev,prev指针一开始指向我们的头节点head,cur指针一开始指向我们的头节点的下一个节点.

2:此时我们先不去判断我们头节点是否是需要删除的节点,先从第二个节点开始判断,最后再判断我们的头节点.

3:然后从cur指向的节点开始遍历我们的链表,如果此时cur所指向的节点的值域与所提供的val值相同,那么prev的next域指向cur所指向的节点的下一个节点,逻辑上来说此时相当于删除了cur所指向的节点,然后cur继续往下遍历,当cur所指向的节点的值域与所提供的val值不相同时,让prev指针此时也指向cur指针此时指向的节点,然后cur指针继续向下遍历.

4:最后我们再来判断head指针指向的头节点的值域是否与提供的val值相同,如果相同,就让头指针指向其next域存储的节点.最后返回head这个头指针即可.


代码示例

class Solution {
    public ListNode removeElements(ListNode head, int val) {
       if (head == null) {
            return null;
        }
        ListNode prev = head;
        ListNode cur = prev.next;
        while (cur != null) {
            if(cur.val == val) {
                prev.next = cur.next;
            }else {
                prev = cur;
            }
            cur = cur.next;
        }
        /*
        在这里写这个if方法是为了应对此种特殊情况,假设此时有一组链表,存储的数据为
        78,78,78,78,10,假设我们此时不写这个if语句,要去删除key值为78的节点
        则最终删除完毕后,我们会发现结果为78,10,原因是第二个78未被删除掉,所以最后
        当我们执行完上述的删除工作后,还需要在判断下删除完成后的首节点是否为78,如果是,则也需要删掉
        */
        if(head.val == val) {
            head = head.next;
        }
        return head;
    }
}

总结

1:此算法:

时间复杂度:O(N)

空间复杂度:O(1)

2:着重还是复习思路.


相关文章
|
7月前
|
存储 Python
链表中插入节点
链表中插入节点
|
2月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
22 0
LeetCode第二十四题(两两交换链表中的节点)
|
2月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
44 0
Leetcode第十九题(删除链表的倒数第N个节点)
05_删除链表的倒数第N个节点
05_删除链表的倒数第N个节点
|
2月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
52 0
|
4月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
04_两两交换链表中的节点
04_两两交换链表中的节点
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
54 5
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
45 4
|
5月前
|
安全 云计算
云计算自旋锁问题之在线程安全地删除链表节点时,需要频繁加锁会影响性能如何解决
云计算自旋锁问题之在线程安全地删除链表节点时,需要频繁加锁会影响性能如何解决
53 2