24
LinkedList Questions: Middle Element of Linked List - Naive Approach
In this series of posts, I will discuss coding questions on the
The posts in this series will be organized in the following way,
LinkedList
Data structure.The posts in this series will be organized in the following way,
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.
L
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
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
24