力扣刷题(第四十七天)

灵感来源 

- 保持更新,努力学习

- python脚本学习

移除链表元素

解题思路

要移除链表中所有等于给定值val的节点,我们可以采用迭代的方式遍历链表,同时维护一个前驱节点来处理头节点可能被删除的情况。具体步骤如下:

  1. 处理头节点:如果头节点的值等于val,则将头节点移动到下一个节点,直到头节点的值不等于val或链表为空。
  2. 遍历链表:使用两个指针,prev指向当前节点的前驱节点,curr指向当前节点。遍历过程中,如果当前节点的值等于val,则删除该节点(通过prev.next = curr.next);否则,更新前驱节点。
  3. 返回新的头节点:处理完所有节点后,返回新的头节点。

这种方法的时间复杂度是 O (n),其中 n 是链表的长度,因为我们需要遍历每个节点一次。空间复杂度是 O (1),只需要常数级的额外空间。

# 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]:
        # 处理头节点可能需要删除的情况
        while head and head.val == val:
            head = head.next
        
        # 如果链表已经为空,直接返回
        if not head:
            return None
        
        # 初始化前驱节点和当前节点
        prev = head
        curr = head.next
        
        # 遍历链表
        while curr:
            if curr.val == val:
                # 删除当前节点
                prev.next = curr.next
            else:
                # 更新前驱节点
                prev = curr
            # 移动到下一个节点
            curr = curr.next
        
        return head

逐行解释

# 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]:
        # 处理头节点可能需要删除的情况
        # 循环删除所有连续的以val开头的节点
        while head and head.val == val:
            head = head.next
        
        # 如果链表已经为空,直接返回None
        if not head:
            return None
        
        # 初始化前驱节点为头节点
        prev = head
        # 当前节点从头节点的下一个节点开始
        curr = head.next
        
        # 遍历链表,直到当前节点为空
        while curr:
            if curr.val == val:
                # 当前节点的值等于val,删除当前节点
                # 前驱节点的next直接指向当前节点的下一个节点
                prev.next = curr.next
            else:
                # 当前节点的值不等于val,更新前驱节点
                prev = curr
            # 当前节点移动到下一个节点
            curr = curr.next
        
        # 返回处理后的链表头节点
        return head

你可能感兴趣的:(leetcode,算法,职场和发展)