이모저모

leetcode 206 - Reverse Linked List 본문

coding/알고리즘,자료구조

leetcode 206 - Reverse Linked List

Jeo 2022. 1. 17. 09:38

첫 시도..

아무래도 아직 나는 출력을 해보면서 해야 한다^^ 어제 파이썬으로 리스트 노드/연결리스트 구현하는 강의를 들었어서 그 코드를 활용해서 파이참에 프린트 해볼 수 있었다..!

from typing import List

class ListNode:
    def __init__(self, val):
        self.val = val  # 노드는 값을 갖는 부분과
        self.next = None  # 다음 자료를 가리키는 부분으로 이루어진다.

def createLinkedList(in_list: List[int]) -> ListNode:  # List[int]를 ListNode 로 리턴하는 함수.
    if len(in_list) == 0:
        raise RuntimeError("in_list must have data")
    head_node = ListNode(in_list[0])
    last_node = head_node
    for idx in range(1, len(in_list)):
        node = ListNode(in_list[idx])
        last_node.next = node
        last_node = node
    return head_node


def printNodes(node: ListNode):
    crnt_node = node
    while crnt_node is not None:
        print(crnt_node.val, end="  ")
        crnt_node = crnt_node.next

#############################################################
# 문제 - reverse linked list
# Input: head = [1,2,3,4,5]
# Output: [5,4,3,2,1]

#############################################################

# 재료(?)
head = createLinkedList([1,2,3,4,5])

#############################################################

from collections import deque

## 처음 시도한 코드
def get_reversed_list(head: ListNode):
    crnt_node = head
    deq = deque()
    while crnt_node is not None:
        deq.appendleft(crnt_node.val)
        crnt_node = crnt_node.next
    reversed_list = list(deq)
    print(reversed_list)  # 여기까지만 오면 그냥 리스트 형태로 내보내는 것.

    ## 다시 연결리스트로 만드려면

    head_node = ListNode(reversed_list[0])
    last_node = head_node
    for i in range(1, len(reversed_list)):  # 두 번째 노드가 될 요소부터 마지막 노드가 될 요소까지.
        node = ListNode(reversed_list[i])  # 자신을 노드로 만들고
        last_node.next = node  # 지금까지 마지막 노드 였던 아이의 뒤로 자기 자신을 붙이고,
        last_node = node  # 자기 자신은 마지막 노드로 자리잡아 두기.
    return head_node


reversed_head_node = get_reversed_list(head)
printNodes(reversed_head_node)

### 런타임 에러가 났다. 재료를 넣어서 실행하지 않는 이상 코드만 봐서는 reversed_list[0]이 존재하지 않으니까.
### 그래서 이렇게 저렇게 런타임 에러만 없애보자는 시도를 몇 번 더 하다가 아래 코드로는 제출되었다.
### 그러나.. 시간이 오래 걸린다아..ㅎㅎㅎ 다른 분들 코드도 보면서 시간도 줄일 수 있도록 연습해야겠다.

def get_reversed_list(head: ListNode):
    crnt_node = head
    deq = deque()
    while crnt_node is not None:
        deq.appendleft(crnt_node.val)
        crnt_node = crnt_node.next
    reversed_list = list(deq)
    print(reversed_list)  # 여기까지만 오면 그냥 리스트 형태로 내보내는 것.

    ## 다시 연결리스트로 만드려면
    if len(reversed_list) == 0:
        head_node = None
    else:
        head_node = ListNode(reversed_list[0])  # -> 이렇게만 하면 runtime error 가 발생한다.
    last_node = head_node
    for i in range(1, len(reversed_list)):  # 두 번째 노드가 될 요소부터 마지막 노드가 될 요소까지.
        node = ListNode(reversed_list[i])  # 자신을 노드로 만들고
        last_node.next = node  # 지금까지 마지막 노드 였던 아이의 뒤로 자기 자신을 붙이고,
        last_node = node  # 자기 자신은 마지막 노드로 자리잡아 두기.
    return head_node

창피하지만... 나중에 언젠가 발전한 내가 뿌듯하지 않을까 ... 라고 생각하면서.

Comments