0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

「世界で闘うプログラミング力を鍛える本」Pythonコード解答例 - 2.6 回文

Last updated at Posted at 2020-02-02

「世界で闘うプログラミング力を鍛える本」Pythonコード解答例 - 2.6 回文

###CHAP2. 連結リスト

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

#Pythonコード解答例


from chap2_function import* 

def isPalinedrome(head_node):
    reversed_node = reverseAndClone(head_node)
    return isEqual(head_node,reversed_node)

def reverseAndClone(node):
    head_node = None
    while node:
        n = Node(node.data)
        n.next = head_node
        head_node = n
        node = node.next
    
    return head_node

def isEqual(one,two):
    while one and two:
        if one.data != two.data:
            return False
        one = one.next
        two = two.next
    return one == None and two == None

dll_1 = DoublyLinkedList() 

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

dll_1.printList(dll_1.head) 

print(isPalinedrome(dll_1.head))

dll_2 = DoublyLinkedList() 

# DLL: None -> 0(ヘッド) -> 1 -> 2 -> 1(ラスト) -> None 
dll_2.append(0)  
dll_2.append(1) 
dll_2.append(2) 
dll_2.append(1) 

dll_2.printList(dll_2.head) 

print(isPalinedrome(dll_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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?