Pythonで連結リストの末尾からN番目のノードを削除する方法
連結リストがあるとします。このリストの末尾からN番目のノードを削除し、削除後のリストの先頭(head)を返す必要があります。例えば、リストが [1, 2, 3, 4, 5, 6] で n = 3 の場合、返されるリストは [1, 2, 3, 5, 6] となります。
解法のアプローチ
この問題は「two-pointer(双ポインタ)」テクニックを使うことで効率的に解決できます。以下の手順で処理を行います。
- head の後にノードが存在しない場合(要素が1つのみの場合)、None を返します。
- front と back の両方を head に設定し、counter を 0、flag を false に初期化します。
- counter が n 以下である間、front を1つずつ前に進めます。このとき、front が存在しなくなったら flag を true に設定してループを抜けます。
- その後、front が存在する間、front と back を同時に1つずつ進めます。これにより、back は削除対象ノードの一つ手前の位置に到達します。
- flag が false の場合(削除対象が先頭以外の場合):temp を back の次のノードとし、back.next を temp.next につなぎ替えることで、対象ノードをリストから切り離します。
- flag が true の場合(削除対象が先頭の場合):head を head.next に更新します。
- 最後に head を返します。
Pythonでの実装例
以下の実装を見て、理解を深めましょう。
class ListNode:
def __init__(self, data, next = None):
self.val = data
self.next = next
def make_list(elements):
head = ListNode(elements[0])
for element in elements[1:]:
ptr = head
while ptr.next:
ptr = ptr.next
ptr.next = ListNode(element)
return head
def print_list(head):
ptr = head
print('[', end = "")
while ptr:
print(ptr.val, end = ", ")
ptr = ptr.next
print(']')
class Solution(object):
def removeNthFromEnd(self, head, n):
if not head.next:
return None
front=head
back = head
counter = 0
flag = False
while counter<=n:
if(not front):
flag = True
break
front = front.next
counter+=1
while front:
front = front.next
back = back.next
if not flag:
temp = back.next
back.next = temp.next
temp.next = None
else:
head = head.next
return head
head = make_list([1,2,3,4,5,6])
ob1 = Solution()
print_list(ob1.removeNthFromEnd(head, 3))
入力
[1,2,3,4,5,6]
3
出力
[1,2,3,5,6]
-
Python入門:リストから全要素がNoneのタプルを削除する方法
Pythonでは、リスト内包表記とall()関数を組み合わせることで、すべての要素がNoneであるタプルをリストから簡単に削除できます。この記事では、その具体的な実装方法をコード例とともに解説します。 基本的な考え方 ポイントは次の2つです。 all()関数:イテラブル内のすべての要素が条件を満たす場合にTrueを返します。 not演算子:all()の結果を反転させることで、「すべてがNoneではない」タプルだけを残せます。 サンプルコード my_tuple = [(None, 12), (None, None), (33, 54), (32, 13), (None, )] print(
-
Pythonで連結リストのm個のノードを保持した後にn個のノードを削除するプログラム
始点ノードが「head」である連結リストと、2つの整数 m と n が与えられたとします。リストを走査しながら、先頭から数えて m 個のノードを残した直後の n 個のノードを削除する処理を、連結リストの末尾に到達するまで繰り返します。処理は head ノードから開始し、最後に変更後の連結リストを返します。今回扱う連結リストの構造は次のように定義されています。Node value : <整数値> next : <次のノードへのポインタ>例えば、入力が elements = [1, 2, 3, 4, 5, 6, 7, 8]、m = 3、n = 1 の場合、出