4

LinkedList Questions: Middle Element of Linked List - Naive Approach

 2 years ago
source link: https://dev.to/kathanvakharia/middle-element-of-linked-list-naive-approach-2589
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

In this series of posts, I will discuss coding questions on the LinkedList Data structure.
The posts in this series will be organized in the following way,

  1. Question Link ❓
  2. Possible Explanation 📝
  3. Documented C++ Code 🧹
  4. Time and Space Complexity Analysis ⌛🌌

The Question

Given a non-empty, singly linked list with head node head, return a middle node of the linked list.

If there are two middle nodes, return the second middle node.

https://leetcode.com/problems/middle-of-the-linked-list/

💡 Give yourself at least 15-20 mins to figure out the solution :)

Explanation

The naive approach is very simple but it is important to understand what & why we are doing this to fully understand the optimized approach.

  1. Find the length of LinkedList → L
  2. Find the position (from start) of the node to be deleted: floor(L/2) + 1K

    • eg: for L = 5, required node is 3 = floor(5/2) + 1
    • eg: for L = 6, required node is 4 = floor(6/2) + 1
  3. Reach the Kth node in K-1 iterations and return it.

C++ Code

Definition of Linked List

//Definition for singly-linked list.
struct ListNode
{
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};

Enter fullscreen modeExit fullscreen mode

Solution

ListNode *middleNode(ListNode *head)
    {
        ListNode *temp = head;
        int count = 0;

        //- finding length of LL : O(n)
        while (temp)
        {
            count++;
            temp = temp->next;
        }

        //pointing temp to head again
        temp = head;
        int nodeNo = count / 2 + 1; //doesn't matter if count is odd or even

        //-Time: O(k-1)
        //If I want to reach kth node, I need to go k-1 deep
        for (int i = 1; i <= nodeNo - 1; i++)
        {

            temp = temp->next;
        }
        head = temp;
        return head;
    }
Enter fullscreen modeExit fullscreen mode

Complexity Analysis

Time Complexity: O(n)

O(n) for finding length of List + O(n/2) for reaching the required node = O(n)

Space Complexity: O(1)

We didn't use any extra space


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK