1. 题目:
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1
输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7
输出:[]
2. 我的代码:
# 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]: pre_head = ListNode() pre_head.next = head # 开始位置 slow_i = pre_head fast_i = pre_head.next while fast_i: if fast_i.val != val: slow_i.next = fast_i slow_i = slow_i.next fast_i = fast_i.next slow_i.next = None return pre_head.next
这个与数组去除元素类似,唯一的区别在于链表节点会保留原来的链式关系,所以最后一个元素可能去除不了。在循环中,最后一个元素如果是和val一样,则不会让慢指针指向它。但是,就是刚才说的:链表节点会保留原来的链式关系。任然会保留最后一个是val的元素,所以,需要在循环结束后,将慢指针的新链表的最后一个节点设置为空slow_i.next = None
。