재미로 Python으로 Linked list 구현해보기

2020. 2. 1. 23:59개발/Python

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

class LinkedList:
    def __init__(self):
        self.head = Node("head")
        self.last = self.head
        self.numData = 0
        self.sorted = False

    def append(self, data):
        newNode = Node(data)
        self.last.next = newNode
        self.last = newNode
        self.numData += 1
        self.sorted = False

    def slice(self, idx1, idx2):
        assert idx1 >= 1 and idx2 <= self.numData + 1
        assert idx1 < idx2
        arr = LinkedList()
        currentNode = self.head
        for i in range(self.numData):
            currentNode = currentNode.next
            if i >= idx1 - 1 and i < idx2 - 1:
                arr.append(currentNode.data)
        return arr
    def define(self, arr):
        arr = arr[1:-1].replace(" ","")
        arr = arr.split(",")
        for num in arr:
            self.append(int(num))

    def delete(self, idx):
        if idx > self.numData or idx <= 0:
            print("you cannot delete that index")
        else:
            beforeNode = self.search(idx-1)
            beforeNode.next = beforeNode.next.next
            self.numData -= 1

    def search(self, idx):
        if idx == 0:
            return self.head
        elif idx > self.numData or idx < 0:
            print("you cannot delete that index")
            return
        else:
            cnt = 0
            currentNode = self.head
            while cnt != idx:
                currentNode = currentNode.next
                cnt += 1
            return currentNode.data

    @staticmethod
    def sortTwo(arr1, arr2):
        arr1Current = arr1.head.next
        arr2Current = arr2.head.next
        newarr = LinkedList()

        while arr1Current != None and arr2Current != None:
            if arr1Current.data <= arr2Current.data:
                newarr.append(arr1Current.data)
                arr1Current = arr1Current.next
            else:
                newarr.append(arr2Current.data)
                arr2Current = arr2Current.next
        if arr1Current == None:
            while arr2Current != None:
                newarr.append(arr2Current.data)
                arr2Current = arr2Current.next
        else:
            while arr1Current != None:
                newarr.append(arr1Current.data)
                arr1Current = arr1Current.next
        return newarr

    def sort(self):
        self.sorted = True
        if self.numData == 1:
            self.sorted = True
            return self
        else:
            arr1 = self.slice(1, int(self.numData / 2) + 1)
            arr2 = self.slice(int(self.numData / 2)+ 1, self.numData + 1)
            arr1 = arr1.sort()
            arr2 = arr2.sort()
            return self.sortTwo(arr1, arr2)

a = LinkedList()
b = LinkedList()
a.append(1)
a.append(3)
a.append(2)
a.append(4)

c = a.sort()
print(c.search(2))

d = LinkedList()
d.define("[1,2,3,   4]")
print(d.numData)
print(d.search(3))