🥑
Codding Problems Solutions
  • Introduction
  • CodeWars ⚔️
    • 🌝Beta
      • Count vowels
      • Who am I?
    • 🎒8 Kyu
      • Get the mean of an array
      • Multiply
      • SQL Basics: Mod
    • 🎁7 Kyu
      • 80's Kids #2: Help ALF Find His Spaceship
      • Complementary DNA
      • GROCERY STORE: Inventory
      • Get the Middle Character
      • Growth of a Population
      • Highest and Lowest
      • Indexed capitalization
      • Jaden Casing Strings
      • Moves in squared strings (I)
      • SQL with Harry Potter: Sorting Hat Comparators
      • SQL: Regex String to Table
      • Shortest Word
      • Sorted? yes? no? how?
      • String ends with?
      • Sum of odd numbers
      • Sum of the first nth term of Series
      • Two to One
      • What time is it?
    • 🎩6 Kyu
      • Are they the "same"?
      • Backspaces in string
      • Banker's Plan
      • Bouncing Balls
      • Count the smiley faces!
      • Counting Duplicates
      • Delete occurrences of an element if it occurs more than n times
      • Dubstep
      • Framed Reflection
      • Is a number prime?
      • Linked Lists - Length & Count
      • Lottery Ticket
      • Maze Runner
      • Mexican Wave
      • Number Format
      • Persistent Bugger.
      • Playing with digits
      • Replace With Alphabet Position
      • SQL Basics: Simple EXISTS
      • SQL Basics: Simple HAVING
      • SQL Basics: Simple IN
      • Statistics for an Athletic Association
      • The Deaf Rats of Hamelin
      • Tortoise racing
      • Unique In Order
      • Who likes it?
    • 🎯5 Kyu
      • Double Cola
      • Integers: Recreation One
      • Maximum subarray sum
      • Moving Zeros To The End
      • Pete, the baker
      • Pick peaks
      • Product of consecutive Fib numbers
      • Rot13
      • The Hunger Games - Zoo Disaster!
      • Using Window Functions To Get Top N per Group
      • Variadic Parameter Pack Count
    • 💍4 Kyu
      • Matrix Determinant
      • Memoized Log Cutting
      • Range Extraction
      • Roman Numerals Helper
      • Simple Fun #159: Middle Permutation
      • Strip Comments
      • Sum of Intervals
      • The observed PIN
      • Tuple sum
  • LeetCode 🍃
    • 👌Easy
      • Backspace String Compare
      • Binary Search
      • Binary Tree Tilt
      • Check If N and Its Double Exist
      • Climbing Stairs
      • Complement of Base 10 Integer
      • Consecutive Characters
      • Contains Duplicate
      • Convert Binary Number in a Linked List to Integer
      • Count and Say
      • Defanging an IP Address
      • Delete Node in a Linked List
      • Duplicate Zeros
      • Excel Sheet Column Number
      • Fibonacci Number
      • Find All Numbers Disappeared in an Array
      • Find Numbers with Even Number of Digits
      • Find the Difference
      • First Unique Character in a String
      • Fizz Buzz
      • Goat Latin
      • Height Checker
      • Implement strStr()
      • Intersection of Two Arrays II
      • Invert Binary Tree
      • Jewels and Stones
      • Kids With the Greatest Number of Candies
      • Length of Last Word
      • Longest Common Prefix
      • Longest Word in Dictionary
      • Max Consecutive Ones
      • Maximum Depth of Binary Tree
      • Merge Sorted Array
      • Merge Two Sorted Lists
      • Middle of the Linked List
      • Minimum Depth of Binary Tree
      • Move Zeroes
      • N-th Tribonacci Number
      • Number of 1 Bits
      • Number of Good Pairs
      • Number of Recent Calls
      • Palindrome Number
      • Pascal's Triangle II
      • Path Sum
      • Plus One
      • Power of Four
      • Power of Two
      • Remove Duplicates from Sorted Array
      • Remove Element
      • Replace Elements with Greatest Element on Right Side
      • Reverse Bits
      • Reverse Integer
      • Reverse String
      • Roman to Integer
      • Running Sum of 1d Array
      • Shuffle the Array
      • Single Number
      • Sort Array By Parity
      • Squares of a Sorted Array
      • Sum of Left Leaves
      • Sum of Root To Leaf Binary Numbers
      • Symmetric Tree
      • Tenth Line
      • Third Maximum Number
      • Transpose Matrix
      • Two Sum
      • Valid Anagram
      • Valid Mountain Array
      • Valid Parentheses
      • Word Pattern
      • XOR Operation in an Array
    • 👊Medium
      • All Elements in Two Binary Search Trees
      • Asteroid Collision
      • Binary Tree Inorder Traversal
      • Binary Tree Level Order Traversal
      • Binary Tree Postorder Traversal
      • Binary Tree Preorder Traversal
      • Bulls and Cows
      • Car Pooling
      • Combination Sum
      • Combination Sum III
      • Compare Version Numbers
      • Counting Bits
      • Course Schedule II
      • Design Linked List
      • Gas Station
      • House Robber
      • Image Overlap
      • Insert Interval
      • Insert into a Binary Search Tree
      • Insertion Sort List
      • K-diff Pairs in an Array
      • Kth Largest Element in an Array
      • Longest Substring Without Repeating Characters
      • Lowest Common Ancestor of a Binary Tree
      • Majority Element II
      • Maximum Difference Between Node and Ancestor
      • Maximum Product Subarray
      • Minimum Domino Rotations For Equal Row
      • Minimum Number of Arrows to Burst Balloons
      • Random Point in Non-overlapping Rectangles
      • Remove Covered Intervals
      • Rotate Array
      • Rotate Image
      • Rotate List
      • Rotting Oranges
      • Serialize and Deserialize BST
      • Sort List
      • String to Integer (atoi)
      • Teemo Attacking
      • Top K Frequent Elements
      • Valid Sudoku
    • 💪Hard
      • Median of Two Sorted Arrays
      • Parsing A Boolean Expression
      • Recover Binary Search Tree
      • Stone Game IV
Powered by GitBook
On this page
  • Design Linked List
  • Solutions
  • 🧠 Cpp

Was this helpful?

  1. LeetCode 🍃
  2. Medium

Design Linked List

PreviousCourse Schedule IINextGas Station

Last updated 4 years ago

Was this helpful?

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 of the current node, and next is a pointer/reference to the next node. If you want to use the doubly linked list, you will need one more attribute prev to indicate the previous node in the linked list. Assume all nodes in the linked list are 0-indexed.

Implement the MyLinkedList class:

  • MyLinkedList() Initializes the MyLinkedList object.

  • int get(int index) Get the value of the indexth node in the linked list. If the index is invalid, return -1.

  • void addAtHead(int val) Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list.

  • void addAtTail(int val) Append a node of value val as the last element of the linked list.

  • void addAtIndex(int index, int val) Add a node of value val before the indexth node in the linked list. If index equals the length of the linked list, the node will be appended to the end of the linked list. If index is greater than the length, the node will not be inserted.

  • void deleteAtIndex(int index) Delete the indexth node in the linked list, if the index is valid.

Example 1:


Input
["MyLinkedList", "addAtHead", "addAtTail", "addAtIndex", "get", "deleteAtIndex", "get"]
[[], [1], [3], [1, 2], [1], [1], [1]]
Output
[null, null, null, null, 2, null, 3]

Explanation
MyLinkedList myLinkedList = new MyLinkedList();
myLinkedList.addAtHead(1);
myLinkedList.addAtTail(3);
myLinkedList.addAtIndex(1, 2);    // linked list becomes 1->2->3
myLinkedList.get(1);              // return 2
myLinkedList.deleteAtIndex(1);    // now the linked list is 1->3
myLinkedList.get(1);              // return 3

Constraints:

  • 0 <= index, val <= 1000

  • Please do not use the built-in LinkedList library.

  • At most 2000 calls will be made to get, addAtHead, addAtTail, addAtIndex and deleteAtIndex.

Solutions

🧠 Cpp

struct Node
{
    Node(int v) : val(v){}
    int val;
    Node *next = nullptr;
};

class MyLinkedList
{
    Node *head = nullptr,
         *tail = nullptr;
    size_t size = 0;

public:
    /** Initialize your data structure here. */
    MyLinkedList() = default;

    /** Get the value of the index-th node in the linked list. If the index is invalid, return -1. */
    int get(int index)
    {
        if(!size || index > size-1) 
            return -1;

        Node *asked_node = head;
        //node at index
        for(; index != 0; --index)
            asked_node = asked_node->next;

        return asked_node->val;
    }

    /** Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list. */
    void addAtHead(int val)
    {
        Node *new_node = new Node(val);

        //init
        if(!head)
            head = tail = new_node;
        else
        {
            new_node->next = head;
            head = new_node;
        }
        size++;
    }

    /** Append a node of value val to the last element of the linked list. */
    void addAtTail(int val)
    {
        Node *new_node = new Node(val);
        //init
        if(!head)
            head = tail = new_node;
        else
        {
            tail->next = new_node;
            tail = new_node;
        }
        size++;
    }

    /** Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted. */
    void addAtIndex(int index, int val)
    {
        //index should exist
        // or index == size, it`s push_back
        if(index > size) 
            return;


        if(index == 0)
            addAtHead(val);
        else if(index == size)
            addAtTail(val);
        else
        {
            Node *new_node = new Node(val),
                 //one node before insertion position
                 *prev_node = head;
            for(; index != 1; --index)
                prev_node = prev_node->next;

            new_node->next = prev_node->next;
            prev_node->next = new_node;
            size++;    
        }

    }

    /** Delete the index-th node in the linked list, if the index is valid. */
    void deleteAtIndex(int index)
    {
        //index should exist
        if(index > size-1) 
            return;


        if(index == 0)
        {
            //delete head
            Node *head_next = head->next;
            if(head == tail)
                tail = nullptr;

            delete head;
            head = head_next;
        }
        else if(index == size-1)
        {
            //delete tail
            Node *prev_node = head;
            //get node before index
            for(; index != 1; --index)
                prev_node = prev_node->next;

            prev_node->next = nullptr;
            delete tail;
            tail = prev_node;
        }
        else
        {
            //delete node in the middle
            Node *prev_node = head;
            //get node before index
            for(; index != 1; --index)
                prev_node = prev_node->next;

            Node *to_delete = prev_node->next;
            prev_node->next = to_delete->next;
            delete to_delete;

        }
        size--;
    }
};

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList* obj = new MyLinkedList();
 * int param_1 = obj->get(index);
 * obj->addAtHead(val);
 * obj->addAtTail(val);
 * obj->addAtIndex(index,val);
 * obj->deleteAtIndex(index);
 */
👊
Design Linked List