自己写的:
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = nextclass Solution:def removeElements(self, head: Optional[ListNode], val):# 初始化一个元组 res,包含一个布尔值和链表头部的引用res = (True, head)# 循环调用 remove_val 方法,直到 remove_val 返回 False,表示没有找到要移除的值while res[0]:res = self.remove_val(res[1], val)# 返回最终处理后的链表头部return res[1]def remove_val(self, head, val):# 初始化当前节点为链表头部cur = head# 初始化前一个节点为 Nonepre = None# 遍历链表while cur != None:# 如果当前节点的值等于要移除的值if cur.val == val:# 如果前一个节点为 None,说明要移除的值在链表头部# 将链表头部更新为当前节点的下一个节点if pre == None:head = cur.nextelse:# 如果前一个节点不为 None,将前一个节点的 next 指向当前节点的下一个节点pre.next = cur.next# 将当前节点的 next 设为 None,断开当前节点的连接cur.next = None# 返回 True 表示已经找到并移除了值return True, headelse:# 如果当前节点的值不等于要移除的值,更新前一个节点和当前节点的引用pre = curcur = cur.next# 如果遍历完链表仍未找到要移除的值,返回 Falsereturn False, head
gpt改进:在头节点前面添加一个虚拟节点 可以省掉很多麻烦
class Solution:def removeElements(self, head: Optional[ListNode], val):# 创建一个虚拟头节点,简化对头部的处理dummy = ListNode(0)dummy.next = head# 初始化当前节点为虚拟头节点cur = dummy# 遍历链表while cur.next:# 如果当前节点的下一个节点的值等于要移除的值if cur.next.val == val:# 删除当前节点的下一个节点cur.next = cur.next.nextelse:# 如果当前节点的下一个节点的值不等于要移除的值,继续向后移动cur = cur.next# 返回虚拟头节点的下一个节点作为新的头部return dummy.next