203-移除链表元素

Posted by LemonWhale on April 24, 2024

题目

给你一个链表的头节点 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