1.哨兵节点(虚拟节点)
- 如果要删除的节点是中间节点,将prev的next设置为要删除节点的next即可
- 如果要删除的节点位于链表的头部,可通过哨兵节点解决
哨兵节点广泛应用于树和链表中,如伪头、伪尾和标记等
算法实现
- 初始化一个哨兵节点
shead= ListNode(0)
,且shead.next =head
- 初始化两个指针
prev
和curr
,指向前继节点和当前节点 - 比较当前节点和要删除的节点:若当前节点就是要删除的节点则
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—null
-
加上虚拟头节点shead时,结构为0—1—null
3. 如果移除1这个节点,那么此时结构变成了两部分
此时返回shead.next,即返回null;head一直指向1节点