LoginSignup
0
1

More than 3 years have passed since last update.

「世界で闘うプログラミング力を鍛える本」Pythonコード解答例 - 2.5 リストで表された2数の和

Last updated at Posted at 2020-02-02

「世界で闘うプログラミング力を鍛える本」Pythonコード解答例 - 2.5 リストで表された2数の和

CHAP2. 連結リスト

  1. 重複要素の削除
  2. 後ろからK番目を返す
  3. 間の要素を削除
  4. リストの分割
  5. リストで表された2数の和
  6. 回文
  7. 交わるノード

Pythonコード解答例


from chap2_function import* 

def dll_from_node(node): 

    dll = DoublyLinkedList()

    while(node is not None): 
        dll.append(node.data) 
        last = node 
        node = node.next

    return dll



def addLists(l1,l2,carry):

    if l1==None and l2==None and carry==0:
        return None

    value = carry

    if l1:
        value = value + l1.data

    if l2:
        value = value + l2.data


    result=Node(value%10)

    if l1 or l2:
        more = addLists(None if l1==None else l1.next,
                        None if l2==None else l2.next,
                        1 if value >= 10 else 0
                        )
        result.next = more

    return result

dll_1 = DoublyLinkedList() 

# DLL: None -> 7(ヘッド) -> 1 -> 6(ラスト) -> None 
dll_1.append(7)  
dll_1.append(1) 
dll_1.append(6) 

dll_1.printList(dll_1.head) 

dll_2 = DoublyLinkedList() 

# DLL: None -> 7(ヘッド) -> 1 -> 6(ラスト) -> None 
dll_2.append(5)  
dll_2.append(9) 
dll_2.append(2) 

dll_2.printList(dll_2.head) 

result_1 = addLists(dll_1.head,dll_2.head,0)

dll_result_1 = dll_from_node(result_1)

dll_result_1.printList(dll_result_1.head)

dll_3 = DoublyLinkedList() 

# DLL: None -> 9(ヘッド) -> 9 -> 9(ラスト) -> None 
dll_3.append(9)  
dll_3.append(9) 
dll_3.append(9) 

dll_3.printList(dll_3.head) 

dll_4 = DoublyLinkedList() 

# DLL: None -> 9(ヘッド) -> 9 -> 9(ラスト) -> None 
dll_4.append(9)  
dll_4.append(9) 
dll_4.append(9) 

dll_4.printList(dll_4.head) 

result_2 = addLists(dll_3.head,dll_4.head,0)

dll_result_2 = dll_from_node(result_2)

dll_result_2.printList(dll_result_2.head)

Python関数(ノードクラス, 双方向リストクラス)

chap2_function.py
# ノードクラス
class Node: 

    # コンストラクタ
    def __init__(self, data): 
        self.data = data 
        self.next = None
        self.prev = None

# 双方向リストクラス
class DoublyLinkedList: 

    # コンストラクタ
    def __init__(self): 
        self.head = None

    # 第一ノードからのノード挿入
    def push(self, new_data): 

        # ノード生成
        new_node = Node(new_data) 

        # 新ノードの次ノードをそもそもヘッドノードだったものにする
        new_node.next = self.head 

        # そもそもヘッドノードだったものの前ノードを新ノードにする
        if self.head is not None: 
            self.head.prev = new_node 

        # 新ノードをヘッドノードにする
        self.head = new_node 

    # 中間地点でのノード挿入 
    def insert(self, prev_node, new_data): 

        # prev_nodeで指定したノードの後にノード挿入するか指定
        # もしNoneの場合は、関数を出る
        if prev_node is None: 
            print("the given previous node cannot be NULL")
            return 

        # ノード生成
        new_node = Node(new_data) 

        # 新ノードの次ノードをprev_nodeで指定したノードの次ノードにする
        new_node.next = prev_node.next

        # prev_nodeで指定したノードの次ノードを新ノードにする
        prev_node.next = new_node 

        # 新ノードの前ノードをprev_nodeで指定したノードにする
        new_node.prev = prev_node 

        # 新ノードの次ノードをprev_nodeで指定したノードの次ノードにしたが、そのノードの前ノードも新ノードにする
        if new_node.next is not None: 
            new_node.next.prev = new_node 

    # 最終ノードからのノード挿入
    def append(self, new_data): 

        # ノード生成 
        new_node = Node(new_data) 

        # 新ノードの次ノードをNone定義
        new_node.next = None

        # もしヘッドノードが設定されていない(空のリスト)場合、新ノードをヘッドノードに設定する
        if self.head is None: 
            new_node.prev = None
            self.head = new_node 
            return 

        # 最終ノードを設定する(順方向走査)
        last = self.head 
        while(last.next is not None): 
            last = last.next

        # 新ノードを最終ノードに指定する
        last.next = new_node 

        # 7. 新ノードの前ノードをそもそも最終ノードだったものにする
        new_node.prev = last 

        return

    def delete(self,del_node):

        if self.head == None or del_node == None: 
            return 

        if self.head == del_node: 
            self.head = del_node.next

        if del_node.next != None: 
            del_node.next.prev = del_node.prev 

        if del_node.prev != None: 
            del_node.prev.next = del_node.next

    def printList(self, node): 

        print("双方向リスト: \n") 

        print("順方向走査")
        while(node is not None): 
            print(node.data,end="") 
            last = node 
            node = node.next
            if node:
                print(" -> ",end="")
            else:
                print("\n")

        print("逆方向走査")
        while(last is not None): 
            print(last.data,end="")
            last = last.prev 
            if last:
                print(" -> ",end="")
            else:
                print("\n")

if __name__ == '__main__':
    # 空の双方向リストの生成
    # DLL: None
    dll = DoublyLinkedList() 
    # DLL: None -> 6(ヘッド/ラスト) -> None
    dll.append(6) 
    # DLL: None -> 7(ヘッド) -> 6(ラスト) -> None 
    dll.push(7) 
    # DLL: None -> 1(ヘッド) -> 7 -> 6(ラスト) -> None 
    dll.push(1) 
    # DLL: None -> 1(ヘッド) -> 7 -> 6 -> 4(ラスト) -> None 
    dll.append(4) 
    # DLL: None -> 1(ヘッド) -> 7 -> 8 -> 6 -> 4(ラスト) -> None 
    dll.insert(dll.head.next, 8) 
    # DLL: None -> 1(ヘッド) -> 8 -> 6 -> 4(ラスト) -> None 
    dll.delete(dll.head.next) 
    dll.printList(dll.head) 

参考文献

[1] GeeksforGeeks: Doubly Linked List | Set 1 (Introduction and Insertion)
[2] GeeksforGeeks: Delete a node in a Doubly Linked List

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1