Pythonでの双方向リンクリストの実装と操作方法


まず、双方向リンクリストのノードを表すクラスを作成します。各ノードは、データと前後のノードへの参照を持ちます。

class Node:
    def __init__(self, data):
        self.data = data
        self.prev = None
        self.next = None

次に、双方向リンクリストを表すクラスを作成します。このクラスでは、リストの先頭と末尾のノードへの参照を保持します。

class DoublyLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None

双方向リンクリストには、以下のような基本的な操作があります。

  1. ノードの挿入
  2. ノードの削除
  3. リストの先頭への要素の追加
  4. リストの末尾への要素の追加
  5. リストの先頭から末尾への要素の表示
  6. リストの末尾から先頭への要素の表示
  7. 特定の要素の検索
  8. リストの要素数の取得

それでは、各操作のコード例を示します。

  1. ノードの挿入
def insert(self, data, position):
    new_node = Node(data)
    if self.head is None:
        self.head = new_node
        self.tail = new_node
    else:
        if position == 0:
            new_node.next = self.head
            self.head.prev = new_node
            self.head = new_node
        else:
            current = self.head
            count = 0
            while current.next is not None and count < position:
                current = current.next
                count += 1
            if count == position:
                new_node.prev = current.prev
                new_node.next = current
                current.prev.next = new_node
                current.prev = new_node
            else:
                self.tail.next = new_node
                new_node.prev = self.tail
                self.tail = new_node
  1. ノードの削除
def delete(self, position):
    if self.head is None:
        return
    if position == 0:
        if self.head.next is None:
            self.head = None
            self.tail = None
        else:
            self.head = self.head.next
            self.head.prev = None
    else:
        current = self.head
        count = 0
        while current.next is not None and count < position:
            current = current.next
            count += 1
        if count == position:
            if current.next is None:
                self.tail = current.prev
                current.prev.next = None
            else:
                current.prev.next = current.next
                current.next.prev = current.prev
  1. リストの先頭への要素の追加
def add_first(self, data):
    new_node = Node(data)
    if self.head is None:
        self.head = new_node
        self.tail = new_node
    else:
        new_node.next = self.head
        self.head.prev = new_node
        self.head = new_node
  1. リストの末尾への要素の追加
def add_last(self, data):
    new_node = Node(data)
    if self.tail is None:
        self.head = new_node
        self.tail = new_node
    else:
        self.tail.next = new_node
        new_node.prev = self.tail
        self.tail = new_node
  1. リストの先頭から末尾への要素の表示
def display_forward(self):
   以下のコードを使用して、リストの要素を先頭から末尾に表示できます。
```python
def display_forward(self):
    current = self.head
    while current is not None:
        print(current.data)
        current = current.next
  1. リストの末尾から先頭への要素の表示
    def display_backward(self):
    current = self.tail
    while current is not None:
        print(current.data)
        current = current.prev
  2. 特定の要素の検索
    def search(self, data):
    current = self.head
    while current is not None:
        if current.data == data:
            return True
        current = current.next
    return False
  3. リストの要素数の取得
    def size(self):
    count = 0
    current = self.head
    while current is not None:
        count += 1
        current = current.next
    return count

これらは双方向リンクリストの基本的な操作例です。さまざまな操作を組み合わせて、さらに高度な機能や応用を実装することもできます。