【leetcode】203:移除链表元素

这篇博客讨论了两种在单链表中删除特定值的方法。第一种是创建新的链表,过滤掉不符合条件的节点,空间复杂度较高。第二种方法使用dummy节点,通过遍历链表直接删除不需要的节点,保持链表结构,这种方法更高效。代码示例展示了如何实现这两种方法。
摘要由CSDN通过智能技术生成

题目如下所示:

 这个题目也就是你一遇到一个node符合要求,你就可以将其删除。是一个比较简单的基础题目,用于熟悉链表当中的最基本操作。我们可以使用如下的方法,也就是暴力法,遍历整个linked list,然后将所有的nodes保存到一个list里面,对不符合要求的values进行排除,然后再重新建立一个新的linked list,将符合要求的values放置进去。但是这样的话,虽然时间复杂度为o(n),但是空间复杂度却有点大,我们先来看看这个方法的代码实现:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeElements(self, head: ListNode, val: int) -> ListNode:
        ls=[]
        while head:
            ls.append(head)
            head=head.next
        new_ls=[]
        for i in ls:
            if i.val==val:
                pass
            else:
                new_ls.append(i.val)
        ret=ListNode(0)
        cur=ret
        for i in new_ls:
            ret.next=ListNode(i)
            ret=ret.next
        return cur.next

方法二:

使用dummy vaiable

class Solution:
    def removeElements(self, head: ListNode, val: int) -> ListNode:
        dummy = ListNode()
        dummy.next = head
        p = dummy
        while p is not None:
            # 向前探一个节点检查是否等于val
            if p.next and p.next.val == val:
                # 跳过 p.next 节点
                p.next = p.next.next 
            else:
                p = p.next
        return dummy.next

同样的方法,不同的变量:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeElements(self, head: ListNode, val: int) -> ListNode:
        cur=ListNode(0)
        cur.next=head
        node=cur
        while cur:
            if cur.next and cur.next.val==val:
                cur.next=cur.next.next
            else:
                cur=cur.next
        return node.next

我们使用这个方法,所需要用到的判断永远是使用cur.next进行判断,有可能漏掉第一个node,因此我们需要设定一个cur在head的前面。对head的第一个node进行判断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值