検索ガイド -Search Guide-

単語と単語を空白で区切ることで AND 検索になります。
例: python デコレータ ('python' と 'デコレータ' 両方を含む記事を検索します)
単語の前に '-' を付けることで NOT 検索になります。
例: python -デコレータ ('python' は含むが 'デコレータ' は含まない記事を検索します)
" (ダブルクオート) で語句を囲むことで 完全一致検索になります。
例: "python data" 実装 ('python data' と '実装' 両方を含む記事を検索します。'python data 実装' の検索とは異なります。)
img_for_tre_tron

Tré Thộn を食べたことがありますか?
ベトナム・ビンズオン滞在中の方は是非注文して食べてみて!
絶対に美味しいです!
ホーチミン市内へも配達可能です。お問い合わせください。

Have you ever had "Tré Thộn" before?
If you're living at Bình Dương in Vietnam, you "must" try to order and eat it.
I'm sure you're very surprised how delicious it is!!
If you're in Hồ Chí Minh, you have a chance to get it too. Please call!!
>>

【 Python Data Structures and Algorithms 】Python とデータ構造 ( data structure ) - linked list を実装してみよう! Linked List 実装 Python Programming Interview 模擬問題 投稿一覧へ戻る

Published 2020年8月1日12:33 by mootaro23

SUPPORT UKRAINE

- Your indifference to the act of cruelty can thrive rogue nations like Russia -

プログラム開発をする上で、データ構造 ( data structure ) とアルゴリズム ( algorithm ) の知識は必須です。


そこで今回は Linked List を実装してみます。


Linked List は要素 ( ノード: node ) のただの羅列に過ぎません。


しかし、それぞれのノードは、自分の次に並んでいるノードの情報を持っています。







ですから、Linked List の実装には、Node クラスと、それらを管理して Linked List としての機能を提供するクラスの2つが必要です。


是非 Python 用の Programming Interview の前哨戦として挑戦してみてください。


制限時間: 60分

Question:

・以下の Node クラスのインスタンスを要素とする linked list を実装してください。

・必要なクラスは Node クラスと Linkedlist クラスの2つですが、Node クラスは与えられているものをそのまま使用してください。

・LinkedList クラスではすでに __init__ と __repr__ が実装されています。この2つの関数は変更せずにこのまま使用してください。

・LinkedList クラスで実装が必要な関数の定義は与えられています。それらの関数の実体をコーディングしてください。

・それぞれの関数を使用した際の出力結果が、与えられている出力結果と一致していなければなりません。




class Node:
"""
注意: このクラスは変更せずこのまま使用すること。

Linked List を構成する要素 ( ノード )。
"""

def __init__(self, name: str, age: int):
"""
:attribute next_node: 自分の次に位置するノード ( Node 型 )。自分が最後の場合は None 。
"""

self.name = name
self.age = age
self.next_node = None

def __repr__(self):
return f"{self.name}({self.age})"


class LinkedList:
"""
Linked List 実装クラス
"""

def __init__(self, first_node: Node = None):
"""
注意: この関数は変更せずこのまま使用すること。

:param first_node: Linked List の最初のノード ( Node 型 )。
"""

self._first_node = first_node

def __repr__(self):
"""
注意: この関数は変更せずこのまま使用すること。
"""

nodes = []
node = self._first_node
while node is not None:
nodes.append(repr(node))
node = node.next_node

nodes.append('None')
return ' -> '.join(nodes)


def __len__(self):
"""
:return: int型
"""

pass


def prepend(self, other: Node):
"""
リストの先頭にノードを追加する。

:param other: 追加するノード
"""

pass


def append(self, other: Node):
"""
リストの最後にノードを追加する。

:param other: 追加するノード
"""

pass


def append_after(self, arg_name: str, other: Node):
"""
name 属性値として arg_name を持つノードの後に other を追加する。
arg_name を持つノードが存在しない場合はメッセージを表示し終了する(追加しない)。
同じ属性値を持つノードがリストに複数含まれている場合は、先頭から検索し最初にマッチしたノードの次に追加する。

:param arg_name: この値の name 属性を持つノードの後に追加する
:param other: 追加するノード
"""

pass


def find_node(self, arg_name: str):
"""
name 属性値として arg_name を持つノードを検索する。
同じ属性値を持つノードがリストに複数含まれている場合は、先頭から検索し最初にマッチしたノードを返す。

:param arg_name: この値の name 属性を持つノードを検索する
:return: 該当するノード、もしくは、None (見つからなかった場合)
"""

pass


def remove(self, arg_name: str):
"""
name 属性値として arg_name を持つノードを削除する。
同じ属性値を持つノードがリストに複数含まれている場合は、先頭から検索し最初にマッチしたノードを削除する。

:param arg_name: この値の name 属性値を持つノードを削除する
"""

pass


def reverse(self):
"""
Linked list の並び順を逆にする。
"""

pass


def reverse_recursive(self):
"""
reverse 関数の再帰バージョン
"""

def recursion(cur, prev):
pass

self._first_node = recursion(cur=self._first_node, prev=None)




各ステートメントを実行した際には、print 文によって以下の内容が表示されるか、メッセージが表示されること。


linked_list = LinkedList()

print(linked_list)
# None

linked_list.remove('nothing')
# リストは空です

linked_list.append(Node('two', 2))
linked_list.append(Node('three', 3))

print(linked_list)
# two(2) -> three(3) -> None

linked_list.prepend(Node('one', 1))

print(linked_list)
# one(1) -> two(2) -> three(3) -> None

linked_list.append(Node('four', 4))
linked_list.append(Node('five', 5))
linked_list.append(Node('seven', 7))

print(linked_list)
# one(1) -> two(2) -> three(3) -> four(4) -> five(5) -> seven(7) -> None

linked_list.append_after('five', Node('six', 6))

print(linked_list)
# one(1) -> two(2) -> three(3) -> four(4) -> five(5) -> six(6) -> seven(7) -> None

linked_list.reverse()

print(linked_list)
# seven(7) -> six(6) -> five(5) -> four(4) -> three(3) -> two(2) -> one(1) -> None

linked_list.reverse_recursive()

print(linked_list)
# one(1) -> two(2) -> three(3) -> four(4) -> five(5) -> six(6) -> seven(7) -> None

linked_list.remove('nothing')
# リスト内に名前は存在しません (nothing)。0 個のノードが削除されました。

linked_list.remove('one')

print(linked_list)
# two(2) -> three(3) -> four(4) -> five(5) -> six(6) -> seven(7) -> None

linked_list.remove('four')

print(linked_list)
# two(2) -> three(3) -> five(5) -> six(6) -> seven(7) -> None

linked_list.remove('seven')

print(linked_list)
# two(2) -> three(3) -> five(5) -> six(6) -> None

print(len(linked_list))
# 4

print(linked_list.find_node('three'))
# three(3)

print(linked_list.find_node('ten'))
# None



解答例は こちら