代码随想录算法训练营第三天(1)|203.移除链表元素

59 阅读2分钟

题目描述

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

代码示例

# 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: Optional[ListNode], val: int) -> Optional[ListNode]:
        # 创建一个临时节点作为哨兵节点,简化边界条件处理
        dummy = ListNode(head)
        current = dummy

        # 遍历链表
        while current.next is not None:
            if current.next.val == val:
                # 如果当前节点的下一个节点的值等于目标值,跳过该节点
                current.next = current.next.next
            else:
                # 否则移动到下一个节点
                current = current.next

        # 返回处理后的链表头
        return dummy.next

# 示例用法
if __name__ == "__main__":
    # 创建链表: 1 -> 2 -> 6 -> 3 -> 4 -> 5 -> 6
    head = ListNode(1, ListNode(2, ListNode(6, ListNode(3, ListNode(4, ListNode(5, ListNode(6)))))))
    
    # 创建解决方案对象
    solution = Solution()

    # 移除值为 6 的节点
    result = solution.removeElements(head, 6)

    # 打印移除节点后的链表
    while result:
        print(result.val, end=" -> ")
        result = result.next

初印象

  1. 虚拟节点创建: 一开始的想法是创建一个虚拟节点,将其链接到链表头部,用于简化边界条件的处理。
  2. 指针遍历: 利用指针遍历链表,对于当前指针的下一个节点,如果其值等于目标值 val,则将当前节点的 next 指向下下个节点,从而实现节点的移除。

阅读代码后的思考

  1. 思路一致: 与之前熟悉的思路大致一致,因为最近刚刷过相关题目,所以整体逻辑较为熟悉。

实现过程的困难

  1. 遗漏判断: 在实现过程中,存在一个细节问题,即未对 cur.next 是否为 None 进行判断。这可能导致在循环的最后一次迭代中,对 NoneType 的对象进行访问,从而引发 AttributeError

学习心得

  1. 虚拟节点应用: 巩固了虚拟节点的使用方法,通过创建一个虚拟节点,可以简化链表操作中的边界条件处理,提高代码的可读性和鲁棒性。

通过这道题目的学习,我更加熟悉了链表操作中的常用技巧,也加深了对虚拟节点的理解。这对于提高算法水平和编写高效、健壮的代码都具有积极的影响。