题目
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回新的头节点 。
解法分析
使用不带头结点的链表删除元素或者带有虚拟头结点的链表删除元素;
使用不带头结点的链表时务必考虑头结点的特殊性。
关于链表的理解
链表的理解从指针指向的角度理解比赋值的角度理解更加易懂,如:
current.next = current.next.next
理解为现在current
指向current
的下下个节点,而不是理解为current.next.next
的值赋予给current.next
Python写法
不带虚拟头结点的写法,注意对头节点的特殊操作
# 定义链表
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
if not head:
return head
# 当头结点的数值等于目标数值时,移除头结点,注意是while不是if
while head and head.val == val:
head = head.next
current = head
while current and current.next:
if current.next.val == val:
current.next = current.next.next
else:
current = current.next
return head
带有虚拟头节点的写法,注意返回值为虚拟头节点的下一个节点
# 定义链表
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
dummy_head = ListNode(next = head)
current = dummy_head
while current.next:
if current.next.val == val:
current.next = current.next.next
else:
current = current.next
head = dummy_head.next
return head