移除链表元素

在这里插入图片描述

1.哨兵节点(虚拟节点)

  1. 如果要删除的节点是中间节点,将prev的next设置为要删除节点的next即可
    在这里插入图片描述
  2. 如果要删除的节点位于链表的头部,可通过哨兵节点解决
    在这里插入图片描述
    哨兵节点广泛应用于树和链表中,如伪头、伪尾和标记等
    在这里插入图片描述
    算法实现
  • 初始化一个哨兵节点shead= ListNode(0),且shead.next =head
  • 初始化两个指针prevcurr,指向前继节点和当前节点
  • 比较当前节点和要删除的节点:若当前节点就是要删除的节点则prev.next=curr.next;否则prev=curr
  • 遍历下一个元素curr =curr.next
  • 返回shead.next
class Solution:
    def removeElements(self, head: ListNode, val: int) -> ListNode:
        if not head or not head.next:// 报错 存在只有一个节点的情况
        if not head :
            return head
        shead = ListNode(0)
        shead.next = head
        curr = head
        prev = shead
        while curr:
            if curr.val ==val:
                prev.next = curr.next
            else:
                prev =curr
            curr = curr.next
        
        return shead.next

问题:

最后返回sheah.next而不是head的原因?

  1. 假如链表只有一个结点1.那么它的结构是1—null
    在这里插入图片描述

  2. 加上虚拟头节点shead时,结构为0—1—null

在这里插入图片描述
3. 如果移除1这个节点,那么此时结构变成了两部分
在这里插入图片描述
此时返回shead.next,即返回null;head一直指向1节点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值