15
LinkedList Questions: Middle Element of Linked List - Naive Approach
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,
- Question Link âť“
- Possible Explanation đź“ť
- Documented C++ Code 🧹
- Time and Space Complexity Analysis ⌛🌌
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.
đź’ˇ Give yourself at least 15-20 mins to figure out the solution :)
The naive approach is very simple but it is important to understand what & why we are doing this to fully understand the optimized approach.
- Find the length of LinkedList →
L
- Find the position (from start) of the node to be deleted:
floor(L/2) + 1
→K
- eg: for
L = 5
, required node is3 = floor(5/2) + 1
- eg: for
L = 6
, required node is4 = floor(6/2) + 1
- eg: for
- Reach the
Kth
node in K-1 iterations and return it.
//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) {}
};
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;
}
O(n) for finding length of List + O(n/2) for reaching the required node = O(n)
We didn't use any extra space
15