코딩 공부/Leetcode

[Python] 707. Design Linked List

일하는 공학도 2025. 2. 4. 10:19
728x90

난이도 : medium

 

linked list를 제작하는 문제.

 

class ListNode:
    def __init__(self, value=0, next_node=None):
        self.val = value
        self.next = next_node

class MyLinkedList:
    def __init__(self):
        self.dummy = ListNode()
        self.size = 0

    def get(self, index: int) -> int:
        if index < 0 or index >= self.size:
            return -1

        current = self.dummy.next
        for _ in range(index):
            current = current.next

        return current.val

    def addAtHead(self, val: int) -> None:
        self.addAtIndex(0, val)

    def addAtTail(self, val: int) -> None:
        self.addAtIndex(self.size, val)

    def addAtIndex(self, index: int, val: int) -> None:
        if index > self.size:
            return
        
        predecessor = self.dummy
        for _ in range(index):
            predecessor = predecessor.next
        
        new_node = ListNode(val, predecessor.next)
        predecessor.next = new_node
        self.size += 1

    def deleteAtIndex(self, index: int) -> None:
        if index < 0 or index >= self.size:
            return
        
        predecessor = self.dummy
        for _ in range(index):
            predecessor = predecessor.next
        
        to_delete = predecessor.next
        predecessor.next = to_delete.next
        to_delete.next = None
        self.size -= 1
        
# Your MyLinkedList object will be instantiated and called as such:
# obj = MyLinkedList()
# param_1 = obj.get(index)
# obj.addAtHead(val)
# obj.addAtTail(val)
# obj.addAtIndex(index,val)
# obj.deleteAtIndex(index)
  1. ListNode class 구현, 각 node는 val과 다음 node를 가리키는 포인터(next)를 가짐
  2. MyLinkedList : linked list 관리. dummy node를 사용하여 list의 시작을 표시, size로 리스트 크기 추적
  3. get : index의 node값을 return. 유효하지 않은 index면 -1 return
  4. addAtHead : list 맨 앞에 새 node 추가
  5. addAtTail : list 맨 끝에 새 node 추가
  6. addAtIndex : 지정된 index에 새 node 삽입. 새 node의 다음 포인터를 설정하고, 이전 node의 다음 포인터를 새 node로 update
  7. deleteAtIndex : 지정된 index의 node 제거. 제거할 node의 이전 node와 다음 node를 연결하고, 제거한 node의 다음 포인터를 None으로 설정

Runtime : 77ms (14.02%)

Memory : 18.65MB (58.05%)

728x90