题目描述
给你一个链表的头节点 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
初印象
- 虚拟节点创建: 一开始的想法是创建一个虚拟节点,将其链接到链表头部,用于简化边界条件的处理。
- 指针遍历: 利用指针遍历链表,对于当前指针的下一个节点,如果其值等于目标值
val,则将当前节点的next指向下下个节点,从而实现节点的移除。
阅读代码后的思考
- 思路一致: 与之前熟悉的思路大致一致,因为最近刚刷过相关题目,所以整体逻辑较为熟悉。
实现过程的困难
- 遗漏判断: 在实现过程中,存在一个细节问题,即未对
cur.next是否为None进行判断。这可能导致在循环的最后一次迭代中,对NoneType的对象进行访问,从而引发AttributeError。
学习心得
- 虚拟节点应用: 巩固了虚拟节点的使用方法,通过创建一个虚拟节点,可以简化链表操作中的边界条件处理,提高代码的可读性和鲁棒性。
通过这道题目的学习,我更加熟悉了链表操作中的常用技巧,也加深了对虚拟节点的理解。这对于提高算法水平和编写高效、健壮的代码都具有积极的影响。