MakerHyeon

[LeetCode] 707. Design Linked List (python,C++) 본문

Algorithm/LeetCode

[LeetCode] 707. Design Linked List (python,C++)

유쾌한고등어 2023. 3. 13. 03:30

https://leetcode.com/problems/design-linked-list/description/

 

Design Linked List - LeetCode

Can you solve this real interview question? Design Linked List - Design your implementation of the linked list. You can choose to use a singly or doubly linked list. A node in a singly linked list should have two attributes: val and next. val is the value

leetcode.com


SOLUTION CODE

# PYTHON

class ListNode:
    def __init__(self, val):
        self.val = val
        self.prev = None
        self.next = None

class MyLinkedList:

    def __init__(self):
        self.left = ListNode(0)
        self.right = ListNode(0)
        self.left.next = self.right
        self.right.prev = self.left

    def get(self, index: int) -> int:
        cur = self.left.next
        while cur and index > 0:
            cur = cur.next
            index -= 1
        if cur and cur != self.right and index == 0:
            return cur.val
        return -1

    def addAtHead(self, val: int) -> None:
        node, next, prev = ListNode(val), self.left.next, self.left
        prev.next = node
        next.prev = node
        node.next = next
        node.prev = prev

    def addAtTail(self, val: int) -> None:
        node, next, prev = ListNode(val), self.right, self.right.prev
        prev.next = node
        next.prev = node
        node.next = next
        node.prev = prev

    def addAtIndex(self, index: int, val: int) -> None:
        next = self.left.next
        while next and index > 0:
            next = next.next
            index -= 1
        if next and index == 0:
            node, prev = ListNode(val), next.prev
            node.next, node.prev = next, prev
            next.prev = node
            prev.next = node

    def deleteAtIndex(self, index: int) -> None:
        cur = self.left.next
        while cur and index > 0:
            cur = cur.next
            index -= 1
        if cur and cur !=self.right and index == 0:
            next, prev = cur.next, cur.prev
            next.prev = prev
            prev.next = next
        


# 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)

 

# C++ (feat. deque)

class MyLinkedList {
public:

    deque<int> d;
    MyLinkedList() {
        
    }
    
    int get(int index) {
        
        if(index >= 0 && index < d.size())
        return d[index];
        return -1;
    }
    
    // 맨 앞에 추가
    void addAtHead(int val) {
        d.push_front(val);
    }
    
    // 맨 뒤에 추가
    void addAtTail(int val) {
        d.push_back(val);
    }
    
    // 해당하는 인덱스에 추가
    void addAtIndex(int index, int val) {
        
        // 1.인덱스가 범위 초과하는 경우
        if(index > d.size())
        return;
        
        // 2. 맨끝에 추가
        if(index == d.size())
        {
            d.push_back(val);
            return;
        }
        
        // 3.맨앞에 추가
        if(index==0)
        {
            d.push_front(val);
            return;
        }
        
        // 4.중간에 추가
        d.push_back(0);
        int n = d.size();
        
        for(int i = n-1; i > index; i--)
        d[i] = d[i-1];

        d[index] = val;

        return;
    }   
    
    void deleteAtIndex(int index) {
    
        if(index < 0 || index >= d.size())
        return;

        if(index==0)
        {
            d.pop_front();
            return;
        }

        if(index==d.size()-1)
        {
            d.pop_back();
            return;
        }

        for(int i = index; i < d.size()-1; i++)
        d[i] = d[i+1];

        d.pop_back();
        return;

    }
};

 

Comments