Skip to content

Instantly share code, notes, and snippets.

@RyuaNerin
Last active October 11, 2019 01:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RyuaNerin/68fe28062472e1ea780c9a1f65c27527 to your computer and use it in GitHub Desktop.
Save RyuaNerin/68fe28062472e1ea780c9a1f65c27527 to your computer and use it in GitHub Desktop.
#!/bin/python3
# -*- coding:utf-8 -*-
import os
class DoubleLinkedList:
class Node:
def __init__(self, value):
self.value = value
self.prev : DoubleLinkedList.Node = None
self.next : DoubleLinkedList.Node = None
def get_prev_value(self):
if self.prev == None:
return None
else:
return self.prev.value
def get_next_value(self):
if self.next == None:
return None
else:
return self.next.value
def __init__(self):
self.head : DoubleLinkedList.Node = None
self.len = None
def __iter__(self):
node = self.head
while node != None:
yield node
node = node.next
def get_first(self):
return self.head
def get_last(self):
n = self.head
while n != None and n.next != None:
n = n.next
return n
def add_first(self, value):
n = DoubleLinkedList.Node(value)
if self.head == None:
self.head = n
else:
n.next = self.head
self.head.prev = n
self.head = n
return n
def add_last(self, value):
n = DoubleLinkedList.Node(value)
if self.head == None:
self.head = n
else:
node_last = self.get_last()
node_last.next = n
n.prev = node_last
return n
def add_after(self, node : Node, value):
n = DoubleLinkedList.Node(value)
if node.next != None:
node.next.prev = n
n.next = node.next
node.next = n
n.prev = node
return n
def add_before(self, node : Node, value):
n = DoubleLinkedList.Node(value)
if node.prev == None:
n.next = node
node.prev = n
self.head = n
else:
node.prev.next = n
n.prev = node.prev
node.prev = n
n.next = node
return n
def clear(self):
n = self.head
while n.next != None:
n.prev = None
n.next = None
n = node.next
def remove(self, node : Node):
if self.head == node:
self.head = node.next
if node.prev != None:
node.prev.next = node.next
if node.next != None:
node.next.prev = node.prev
node.prev = None
node.next = None
def remove_first(self):
if self.head == None:
return
node = self.head.next
if node != None:
node.prev = None
self.head = node
else:
self.head = None
def remove_last(self):
node = self.get_last()
if node.prev != None:
node.prev.next = None
node.prev = None
if node == self.head:
self.head = None
def find_node(self, value):
n = self.head
while n != None:
if n.value == value:
return n
n = n.next
return None
if __name__ == "__main__":
lst = DoubleLinkedList()
while True:
os.system('cls')
print("-------------------------------------------------------------------------------------")
index = 0
for node in lst:
pad = ' ' * (index * 5)
vp = node.get_prev_value()
vn = node.get_next_value()
vp = vp if vp != None else ""
vn = vn if vn != None else ""
print("%s< %2s | %2s | %2s >" % (pad, vp, node.value, vn))
index += 1
print("-------------------------------------------------------------------------------------")
print("0 : exit")
print("1 : add first")
print("2 : add last")
print("3 : add after")
print("4 : add before")
print("5 : remove first")
print("6 : remove last")
print("7 : remove")
print("command : ",end='')
inp = input()
if inp == "0":
break
elif inp == "1":
print("input new value : ", end='')
lst.add_first(int(input()))
elif inp == "2":
print("input new value : ", end='')
lst.add_last(int(input()))
elif inp == "3" or inp == "4":
print("input node value : ",end='')
node = lst.find_node(int(input()))
if node != None:
if inp == "3":
print("input new value : ", end='')
lst.add_after(node, int(input()))
else:
print("input new value : ", end='')
lst.add_before(node, int(input()))
elif inp == "5":
lst.remove_first()
elif inp == "6":
lst.remove_last()
elif inp == "7":
print("input node value : ",end='')
node = lst.find_node(int(input()))
if node != None:
lst.remove(node)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment