class Node:

    def __init__(self,value = None, next = None):

        self.data = value

        self.next = next

        self.number = 0

    def __str__(self):

        return str(self.data)

    

class LinkedList:

    def __init__(self, head = None):

       self.node = Node(head)

       self.head = self.node

    #리스트에 노드 추가

    def AppendNode(self,data):

        pre_node = self.node

        self.node = Node(data)

        pre_node.next = self.node

        self.node.number = pre_node.number + 1

    #loc번째 노드에 든 값

    def GetNodeAt(self,loc):

        new_node = self.head

        while new_node.next:

            if new_node.number+1 == loc:

                print (new_node.data)

                break

            else:

                new_node = new_node.next

    #리스트의 길이

    def GetNodeCount(self):

        return self.node.number+1

   

    #loc번째 자리에 data값의 노드 추가

    def InsertNodeAt(self,loc,data):

        node_head = self.head

        insert_node = Node(data)

        insert_node.number = loc-1

        temp = Node()


        while node_head.next:

            if node_head.number+2 == loc:

                temp = node_head.next

                node_head.next = insert_node

                insert_node.next = temp

                break

                

            else:

                node_head = node_head.next

        while True:

            temp.number = temp.number + 1

            temp = temp.next

            if temp.next == None:

                temp.number = temp.number + 1

                break

    #data값이 든 노드 삭제

    def Remove(self,data):

        node_head = self.head

        node_temp = self.head

        remove_node = Node(data)


        while node_head.next:

            if node_head.data == remove_node.data:

                while True:

                    if node_head.number == node_temp.number:

                        self.head = self.head.next

                        break

                    elif node_temp.number == node_head.number - 1:

                        node_temp.next = node_head.next

                        break

                    else:

                        node_temp = node_temp.next

                break

            else:

                node_head = node_head.next

        temp = node_temp.next

        while True:

            temp.number = temp.number - 1

            temp = temp.next

            if temp.next == None:

                temp.number = temp.number - 1

                break

    #리스트에 리스트 추가

    def ExtendList(self, aList):

        for k in aList:

            node_add = Node(k)

            self.AppendNode(node_add)

            

    #리스트 전체 출력

    def PrintLL(self):

        node_print = self.head

        

        while True :

            if node_print.next == None:

                print(node_print.data)

                break

            else:

                print(node_print.data , "->", end=" ")

                node_print = node_print.next

        

#리스트  k 생성

k = LinkedList(4)

#k 리스트에 노드 추가

k.AppendNode(1)

k.AppendNode(2)

k.AppendNode(3)

k.AppendNode(4)

k.AppendNode(5)

#k 리스트 출력

k.PrintLL()

#k리스트에 5번째 자리에 3 추가

k.InsertNodeAt(5,3)

k.PrintLL()

#데이터 4 를 가진 노드 삭제

k.Remove(4)

k.PrintLL()

#리스트[1,2,3]을 리스트k에 추가

k.ExtendList([1,2,3])

k.PrintLL()


1. class Node:

먼저 노드 클래스는 __init__함수와 __str__함수로 구성했다.

Node는 data , next, number로 구성했는데 data는 그 노드의 값, next는 그 다음 링크되어진 값을 가리킨다. 넘버는 위치를 알때 쓰기위해서 만들었다.

2. class LinkedList:

먼저 링크 클래스에서는 초기값으로 노드와 그 노드값중 제일 처음을 가리키는 헤드값을 준다.


2-1. AppendNode( self, data )   

AppendNode는 노드를 하나씩 추가해주기 때문에 먼저 현재 가리키는 노드를 받은 data값으로 만들어 주고 원래 제일 마지막 노드를 가리키는 self.node의 next를 만들어준 노드로 가리키게 하고 self.node를 다시 새로만든 노드로 가리키게 해준다. 또 새로만든 노드의 number값은 그 전값의 +1을 해준다.

2-2 GetNodeAt( self, loc )

loc번째의 노드에 든 값을 나타내어 준다. 먼저 노도의 헤드부분을 가리키는 값을 만들고 while문으로 처음부터 맨 마지막값까지 

if문을 써서 인덱스 값은 0 부터 시작하기에 그값에 1을 더한값의 위치일때 그 값을 출력해준다.

2-3 InsertNodeAt( self, loc, data )

loc번째 자리에 data값의 노드를 추가해주는 함수로 우선 넣어줄 자리를 알아야 한다. 그렇기 때문에 먼저 넣어줄 loc번째 자리에 -1값을 만들어준 노드의 number에 넣어주고 또 while문을 돌려준다. 우선 넣어줄 노드의 앞의 값을 알아야 하기때문에 넣어줄 자리보다 2자리 앞의 값을 찾아서 그값의 next를 넣어줄 데이터로 또 그 다음 자리를 넣어줄 노드의 next값으로 만든다. 그리고 그 뒤의 자리에 값들은 모두 number값에 1을 더해준다.

2-4 GetNodeCount(self)   

self.node의 값은 항상 제일 마지막 자리를 가리키고 있기 때문에 self.node의 number값에 1을 더한 값이 전체 길이!

2-5 Remove( self, data )

먼저 변수가 node_head는 제일처음부터 차례로 내려가면서 삭제할 데이터와 비교할 값이고 node_temp는 삭제할 값 전 노드를 가리킬 변수이다. 우선 삭제할 데이터 값과 현재의 값을 비교하면서 헤드값을 차례로 내려간다. 그리고 삭제할 값과 비교값이 같을때 

우선 제일 첫 헤드노드가 temp노드와 같을때 즉 self.head노드가 삭제할 값일 때 self.head를 next값으로 해줌으로써 제일 앞 노드를 삭제했다. 또 그 다음은 temp노드가 비교노드의 바로 전값이 되기 전까지 내려주고 전 값이면 temp노드의 next를 비교노드의 next와 연결해 줌으로써 가운데 값을 삭제해 준다. 그리고 그후는 삭제된 노드의 다음자리부터 모두 number값을 하나씩 줄여 줌으로써 number값도 세팅해 준다.

2-6 ExtendList( self, aList)

이 함수는 노드를 linked list형으로 바꾸어 주는 것 으로 for 문으로 리스트를 받아 하나씩 AppendNode로 이어준다.

2-7 PrintLL(self)

전체 LinkedList를 끝자리가 아니면 계속해서 이어서 출력해주는 함수이다.





+ Recent posts