Lesson 1 � Beginner
Linked Lists: Nodes ka Chain
Arrays ke baad sabse important data structure hai Linked List. Ye dynamic hai, efficient insertion/deletion deta hai, aur interview mein bahut zyada poocha jaata hai. Chalo step by step samajhte hain ki linked list hota kya hai aur kyun zaroori hai.
Linked List kyun chahiye?
WHAT
Linked list ek linear data structure hai jisme elements (nodes) kisi ek sequence mein hote hain but unki memory allocation contiguous nahi hoti. Har node ek jagah hota hai aur usme next node ka pointer hota hai. Jaise ek treasure hunt � har clue tumhe agle clue ki jagah batata hai.
WHEN
Arrays mein insertion/deletion beginning mein O(n) hota hai kyunki sab elements shift karne padte hain. Linked list mein ye O(1) hota hai kyunki sirf pointers change karne hote hain. Jab frequently insert/delete hoti hai � use linked list.
WHERE
Stack, Queue, Hash Map chaining, Graph adjacency list, LRU Cache � sab linked list pe based hain. Operating systems ki process scheduling bhi linked list use karti hai.
# Linked list ka visual representation
# [10|?] ? [20|?] ? [30|?] ✓ None
# Har box ek Node hai:
# +--------------+
# � data = 10 �
# � next ? 20 �
# +--------------+
# First node = head (entry point)
# Last node = tail (next = None)
Singly vs Doubly Linked List
Do types ke linked lists hain � Singly aur Doubly. Difference samajhna important hai kyunki interview mein dono ke trade-offs poochhe jaate hain.
# Singly Linked List � har node sirf next ka pointer rakhta hai
# [10|?] ? [20|?] ? [30|?] ✓ None
# Ek direction mein travel kar sakte ho � aage
# Doubly Linked List � har node prev aur next dono ka pointer rakhta hai
# None ? [?|10|?] ? [?|20|?] ? [?|30|?] ✓ None
# Dono directions mein travel kar sakte ho � aage aur peeche
Singly ka Faayda
Kam memory use hoti hai � sirf ek pointer extra. Simple traversal ke liye kaafi hai. Stacks aur queues mein ye use hota hai.
Doubly ka Faayda
Peeche ja sakte ho (O(1) previous access). Deletion O(1) hoti hai kisi bhi node ki agar pointer ho. DLL zyada flexible hai but extra memory leta hai.
Kab use karein?
Interview mein aksar singly poochhte hain. Doubly tab use karo jab reverse traversal chahiye � jaise browser history, LRU Cache, ya playlist navigation.
Node Structure samjho
Linked list ka fundamental building block hai Node. Har node mein do cheezein hoti hain � data aur next pointer. Chalo Python mein node banana seekhte hain.
# Node class banana � linked list ka building block
class Node:
def __init__(self, data):
self.data = data
self.next = None # Initially kisi ko point nahi karta
# Ek node banao
first = Node(10)
print(first.data) # 10
print(first.next) # None (abhi kisi ko point nahi karta)
# Doosra node banao
second = Node(20)
third = Node(30)
# Nodes ko link karo � ye magic hai!
first.next = second # first ab second ko point karta hai
second.next = third # second ab third ko point karta hai
# Ab chain hai: 10 ? 20 ? 30 ✓ None
Ye simple hai � bas ek class jo data aur next pointer rakhta hai. Real power tab aati hai jab tum ye nodes ko chain mein connect karte ho. Tumhara "linked list" basically ek node (head) hai jo baaki sab ko point karta hai.
# Linked list traverse karna � head se shuru karke last tak jaao
def traverse(head):
current = head
while current is not None:
print(current.data, end=" ? ")
current = current.next
print("None")
# Use karo
traverse(first) # Output: 10 ? 20 ? 30 ✓ None
Head, Tail, aur Size
Ek linked list mein kuch important concepts hain jo tumhe yaad rakhne chahiye � head (start), tail (end), aur size (kitne nodes hain).
# Linked list ka basic operations
class LinkedList:
def __init__(self):
self.head = None
self.size = 0
def is_empty(self):
return self.head is None
def get_size(self):
return self.size
# Create karo
ll = LinkedList()
print(ll.is_empty()) # True � abhi kuch nahi hai
print(ll.get_size()) # 0
# Nodes add karo (aage ka lesson mein detail mein seekhenge)
ll.head = Node(10)
ll.head.next = Node(20)
ll.size = 2
print(ll.is_empty()) # False � ab kuch hai
print(ll.get_size()) # 2
Head kya hai?
Head linked list ka entry point hai. Bina head ke tum linked list access nahi kar sakte. Head None hai toh list empty hai.
Tail kya hai?
Tail last node hai jiska next = None hota hai. Kuch implementations mein tail pointer bhi rakhte hain O(1) insertion ke liye end mein.
Size kyun chahiye?
Bina traverse kiye size pata karne ke liye. Size field rakhna optional hai � tum loop se bhi count kar sakte ho, but size field O(1) mein size deta hai.
Array: Random access O(1), Insert beginning O(n), Insert end O(1) amortized, Memory contiguous
Linked List: Random access O(n), Insert beginning O(1), Insert end O(1) with tail pointer, Memory non-contiguous (pointers extra)
Try it: code khud likho
Exercise
Question: Given array [5, 10, 15, 20] se ek linked list banao aur print karo. Function likho jo head return kare. Answer mein output likho.
Question: Function likho jo linked list mein total nodes count kare. [10, 20, 30, 40, 50] ke liye answer do.
Common mistakes
- Head lose karna: Jab naya node insert karo beginning mein, pehle head store karo nahi toh puri list lose ho jayegi. Hamesha
new_node.next = headpehle karo, phirhead = new_node. - Infinite loop: Traverse karte waqt
current = current.nextbhool jaana infinite loop de sakta hai. Hamesha None check karo. - None pe access karna: Agar linked list empty hai aur tum
head.dataaccess karte ho toh error aayega. Pehle check karoif head is not None. - Circular reference: Node ka next khud ko point kare toh infinite loop. Debug karte waqt size limit lagao.
Linked lists basics samajh aa gaye✓ Ab Insert, Delete, aur Reverse operations seekhte hain � ye linked list ki real power hai.