Remove Linked List Elements

# 問題

次のように定義される連結リストに対して,指定された要素を削除する関数を書け.

1
2
3
4
5
# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

関数の引数と返り値は次の通り.

1
2
def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
    pass

例:

1
2
3
head = [1] -> [2] -> [6] -> [3] -> [4] -> [5] -> [6]
val = 6
ans = [1] -> [2] ->  [3] -> [4] -> [5] -> [6]

# 解法

  • 単連結リストは「1つ次」が追えるデータ構造
    • つまりcurrがあればcurr.nextが取れる(当たり前)
    • その代わり1つ前が取れないので,追跡したいならそれ用の変数を用意しておく必要がある
  • 単連結リストでの要素の削除は,「currを削除したいなら,prevの次を(currを飛ばして)curr.nextにする」で実現される
  • 1つ前を追跡したいのでprevを考えるが,headの1つ前はどうしようか,となり,dummy_headを用意すればいいじゃないか,と至る.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 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 head is None:
            return None
        dummy_head = ListNode(val=-1, next=head)

        prev = dummy_head
        curr = head

        while curr is not None:
            if curr.val == val:
                prev.next = curr.next
                curr = curr.next
            else:
                curr = curr.next
                prev = prev.next

        return dummy_head.next

# 出典

Hugo で構築されています。
テーマ StackJimmy によって設計されています。