1、今日题目:第203题—删除链表元素
2、题目要求如下:
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
例如:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-linked-list-elements
3、代码及解题思路
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def remove(self, head, val):
if head.next is None:
return head
node = self.remove(head.next, val)
if node.val == val:
head.next = node.next
return head
def removeElements(self, head: ListNode, val: int) -> ListNode:
"""
思路:
一、特殊情况:
head -> [] or head.next -> [] return None
二、一般情况:
1、定义一个工作节点 当作 头节点 比如 node1.next = head
2、两个个工作指针 pre和p ,其中pre记录前驱,p用来检测当前节点是否满足 p.val == val
3、如果满足pre.next = p.next p = p.next
三、迭代条件
p = None时结束
四、运行出错情况:
[1] val = 2时 出错,原因分析:head.next -> [] 这里出错
解决:将head.next 删除
"""
# method1 迭代
# if not head:
# return None
# node1 = ListNode(-1, head)
# pre, p = node1, head
# while p:
# if p.val == val:
# pre.next = p.next
# p = p.next
# else:
# pre = p
# p = p.next
# return node1.next
# method2 递归
"""
递归写两个函数原因是:
[7, 7 ,7 ,7 ,7]这种情况
在递归时,最后返回的是head,而此时head.val == val的
所以另起一个函数,便于操作
"""
if head is None:
return head
node1 = ListNode(-1, head)
return self.remove(node1, val).next
4、收获
巩固递归式,加强理解。