

Let me give you a quick introduction about myself.
I'm a 3 year Student studying Computer Science as a major
I'm just an average person like other's.I'm not talented enough, but I work hard & what I know is "Hard work always beats talent, when talent doesn't work Hard!!”
It's not an language specific article. Trust me, you will learn a lot. Right now it's written in Java but trust me it will never be a issue.
So, with that let's start.
Hello, my fellow programmer's today I'm going to teach you how you can become master's in LinkedList
If you want to become master, then you have to follow some rules, only after that you can become Magician or called Master's in LinkedList
Rules:
"If you had to leave, then why you had start?"Remember : Practice makes a men perfect
#IntroductionWhat is linked list ?
Linked list is an linear data structure, which consists of a group of nodes in a sequence [OR] Linked list in which we store data in linear from!
But, Array also stores data in linear form. Then what's the difference!
In array we have to first define the size of the Array
Let's say:-
int arr[] = new int[8]
Array :- [10, 20, 15, 18, 16, 10, 20, 16]And each bit has it's memory address, where 1 bit size = 4, therefore 8 bit = 8 * 4 = 32 bit.
But linked list is dynamic, we don't have to define it's size.

In linked list we can add element as many as we want. But, in array size is fixed. So, to add new element we have to create a new array!

Advantages DisAdvantages
1. Dynamic Nature 1. More memory usage due to address pointer
2. Optimal insertion & deletion 2. Slow traversal compared to arrays
3. Stack's & queues can be easily implemented 3. No reverse traversal in singly linked list
4. No memory wastage 4. No random accessReal-life Application's :-
#Type's of Linked listThere are 4 type's of linked list, but in general we use 3 type's only:-
Singly-linked list: linked list in which each node points to the next node and the last node points to null

Doubly-linked list: linked list in which each node has two pointers, p and n, such that p points to the previous node and n points to the next node; the last node's n pointer points to null

Circular-linked list: linked list in which each node points to the next node and the last node points back to the first node

Circular-Doubly-linked list:

Time Complexity:
Access: O(n)
Search: O(n)
Insert: O(1)
Remove: O(1)Let's see how to create a linked list
Code :-

Therefore,

Output:-
-------- -------- --------
| 10 | --> | 20 | --> | 30 |
-------- -------- --------Let's see how we traverse in linked list
Code:-

Output:-
-------- -------- --------
| 10 | --> | 20 | --> | 30 | --> X
-------- -------- --------
curr^
print:- 10
**************************************************
-------- -------- --------
| 10 | --> | 20 | --> | 30 | --> X
-------- -------- --------
curr^
print:- 10, 20
**************************************************
-------- -------- --------
| 10 | --> | 20 | --> | 30 | --> X
-------- -------- --------
curr^
print:- 10, 20, 30
**************************************************
-------- -------- --------
| 10 | --> | 20 | --> | 30 | --> X
-------- -------- --------
curr^
print & return answer :- 10, 20, 30Let's see how to insert an element[node] in linked list
Code:-

Key Point :- Never miss your node reference! Otherwise, you will lose your linked list;
Output:-
Given :-
-------- -------- -------- -------- --------
| 5 | --> | 10 | --> | 5 | --> | 24 | --> | 40 |
-------- -------- -------- -------- --------
Insert 30 at 3 index
head˅
-------- -------- -------- -------- --------
| 5 | --> | 10 | --> | 5 | --| |--> | 24 | --> | 40 |
-------- -------- -------- | | -------- --------
prev^ prev^ ˅ |
--------
| 30 |
--------
toAdd^Let's delete an element[node] from linked list
Code :-

Key point:- In java, if there is no reference to a node in linked list, garbage collector will take it off.
Ouput :-
Given :-
-------- -------- -------- -------- --------
| 5 | --> | 10 | --> | 15 | --> | 12 | --> | 14 | --> X
-------- -------- -------- -------- --------
delete 3rd element from linked list
-------- -------- -------- -------- --------
| 5 | --> | 10 | --> | 15 | |-X- | 12 | |----> | 14 | --> X
-------- -------- --------| -------- | --------
|-----------------| Best Question's to practiceProblem list is in order from EASY to HARD in a sequence. And all question's are available on LeetCode!
I highly recommend you to solve these question's & few of them I will solve as well.
206. Reverse Linked ListProblem Statement :-
Input: head = [1,2,3,4,5]
Output: [5,4,3,2,1]
Explanation :-
We use 3 pointer's prev = previous, curr = current, forw = forward. Where prev will point to the previous pointer, curr will point to the current pointer & forw will point to the next pointer.
Prev will hold the previous value becuase, if we break the link. So, we will not lose our linked list
Similarly forw will point to the next pointer after curr. So, that once link is broken we will not lose our remaining linked list.
Once curr reaches null our prev will be on our new head. So, we will return our prev as the answer.

Solution :-
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
ListNode forw = null;
while(curr != null){
forw = curr.next;
curr.next = prev;
prev = curr;
curr = forw;
}
return prev;
}
}
876. Middle of the Linked ListProblem Statement :-
Input: head = [1,2,3,4,5]
Output: [3,4,5]
Explanation:-
We will create 2 pointer's fast & slow
Fast pointer will move at the speed of 2X
Slow pointer will move at the speed of 1X
If fast pointer reaches null or fast.next is null we will return our slow pointer which mean's our slow pointer is pointing at mid of linked list

Solution:-
class Solution {
public ListNode middleNode(ListNode head) {
// Base Condition
if(head.next == null) return head;
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
}
141. Linked List CycleProblem Statement :-
Input: head = [3,2,0,-4], pos = 1
Output: true
Explanation:-
We will create 2 pointer's fast & slow
Fast pointer will move at the speed of 2X
Slow pointer will move at the speed of 1X
If fast pointer & slow pointer meet each other we will return true otherwise they there is no cycle we will return false!!

Solution:-
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow) return true;
}
return false;
}
}
234. Palindrome Linked ListProblem Statement :-
Input: head = [1,2,2,1]
Output: true
Explanation:-



Solution:-
class Solution {
public ListNode reverse(ListNode head){
ListNode prev = null;
ListNode curr = head;
ListNode forw = null;
while(curr != null){
forw = curr.next;
curr.next = prev;
prev = curr;
curr = forw;
}
return prev;
}
public boolean isPalindrome(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
}
slow= reverse(slow);
while(slow != null && (slow.val == head.val)){
head = head.next;
slow = slow.next;
}
return slow == null;
}
}
160. Intersection of Two Linked ListsProblem Statement :-
Input: intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
Output: Intersected at '8'
Explanation:-
So, what we doing is
Take 2 pointer's: pointer A walks through List A and List B (since once it hits null, it goes to List B's head).
Pointer B also walks through List B and List A.
Regardless of the length of the two lists, the sum of the lengths are the same (i.e. a+b = b+a), which means that the pointers sync up at the point of intersection.
If the lists never intersected, it's fine too, because they'll sync up at the end of each list, both of which are null.


Notice that if list A and list B have the same length, this solution will terminate in no more than 1 traversal; if both lists have different lengths,
this solution will terminate in no more than 2 traversals -- in the second traversal, swapping a and b synchronizes a and b before the end of the
second traversal.
By synchronizing a and b I mean both have the same remaining steps in the second traversal so that it's guaranteed for them to reach the
first intersection node, or reach null at the same time (technically speaking, in the same iteration)
-- see Case 2 (Have Intersection & Different Len) and Case 4 (Have No Intersection & Different Len).
PS: There are many great explanations of this solution for various cases, I believe to visualize it can resolve most of your doubts!Solution:-
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode a = headA;
ListNode b = headB;
while(a != b){
a = a == null ? headB : a.next;
b = b == null ? headA : b.next;
}
return b;
}
}Alright, guy's I hope you like my work! If do, then stay tuned. Because i'll post few more solution's**


Last Update :- 28th-Feb-2022