Given the head
of a linked list and an integer val
, remove all the nodes of the linked list that has Node.val == val
, and return the new head.
Example 1:
Input: head = [1,2,6,3,4,5,6], val = 6 Output: [1,2,3,4,5]
Example 2:
Input: head = [], val = 1 Output: []
Example 3:
Input: head = [7,7,7,7], val = 7 Output: []
Constraints:
- The number of nodes in the list is in the range
[0, 104]
. 1 <= Node.val <= 50
0 <= val <= 50
题目要求删除链表中值等于给定值的所有节点。删除节点是链表的最基本操作需要熟练掌握。本题同样也是有迭代和递归两种解法。
迭代法:定义两个指针cur和pre分别指向当前节点及其父节点,遍历整个链表,当遇到当前节点值等于给定值时就删除该节点(pre.next = cur.next),然后继续直到链表结束。
# 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]:
preHead = ListNode(-1, head)
prev, cur = preHead, head
while cur :
if cur.val == val :
prev.next = cur.next
else :
prev = cur
cur = cur.next
return preHead.next
递归法:把链表分成头节点head和剩余部分,递归调用处理剩余部分返回一个新头newHead,由于剩余部分已经处理完不含有值等于val的节点,因此只需判断head,若head值为val,直接返回newHead,否则把head.next指向newHead然后返回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]:
if not head:
return None
newHead = self.removeElements(head.next, val)
if head.val == val:
return newHead
head.next = newHead
return head