📘 CodingMarble Learn

लिंक्ड लिस्ट (Linked List)

लिंक्ड लिस्ट चीज़ों को नोड में रखती है। हर नोड में डेटा और एक पॉइंटर (अगले नोड का पता) होता है। head नाम का वेरिएबल पहले नोड को दिखाता है; आख़िरी नोड NULL को दिखाता है। नोड मेमोरी में कहीं भी हो सकते हैं, इसलिए शुरू में जोड़ना-हटाना बस पॉइंटर बदलना है, पर k-वाँ आइटम ढूँढने के लिए head से चलना पड़ता है।

🎬 कदम-दर-कदम कहानी

  1. ऐरे अपने सारे आइटम मेमोरी के एक ब्लॉक में सटाकर रखता है, जैसे एक कतार में कुर्सियाँ।
  2. लिंक्ड लिस्ट हर आइटम को एक नोड में रखती है। नोड के दो हिस्से: डेटा (पीला) और अगले नोड का पॉइंटर (नीला)। नोड कहीं भी रह सकते हैं।
  3. head पहले नोड को दिखाता है। लिस्ट पढ़ने के लिए हम तीर पकड़कर एक-एक नोड चलते हैं, जब तक NULL (अंत) न आ जाए।
  4. शुरू में जोड़ना: नए नोड को पुराने पहले नोड की ओर करो, फिर head को नए नोड पर ले आओ। बस दो पॉइंटर बदले।
  5. नोड हटाना: उससे पिछले नोड को उसके अगले नोड की ओर कर दो। बीच वाला छूट जाता है और उसकी मेमोरी खाली हो जाती है।
  6. खुद खेलो: जोड़ो, हटाओ, खोजो। कदम गिनने वाला देखो: खोजने के लिए head से चलना पड़ता है।

टिप: 3D दृश्य को घुमाने के लिए खींचें। ज़ूम के लिए दो उंगलियाँ इस्तेमाल करें।

🤔 आम शंकाएँ और उनके जवाब

हमेशा ऐरे ही क्यों न इस्तेमाल करें?

ऐरे k-वें आइटम पर छलाँग के लिए बढ़िया है, पर शुरू में जोड़ने/हटाने पर बहुत आइटम खिसकाने पड़ते हैं। लिस्ट में बस तीर बदलते हैं।

नीले हिस्से में असल में क्या रखा है?

एक मेमोरी पता: अगले नोड की जगह। Python में यह अगले ऑब्जेक्ट का रेफ़रेंस है।

सीधे तीसरे नोड पर क्यों नहीं जा सकते?

सिर्फ़ head पता है। तीसरे नोड का पता दूसरे नोड के अंदर है, इसलिए चलना पड़ता है।

इंसर्ट में दो पॉइंटर बदलने का क्रम मायने रखता है?

हाँ। head हटाने से पहले नए नोड को पुराने पहले नोड से जोड़ो, वरना लिस्ट खो जाएगी।

हटाए गए नोड का क्या होता है?

अब कोई उसे नहीं दिखाता। C में free() करते हैं; Python या Java में गार्बेज कलेक्टर हटा देता है।

लिंक्ड लिस्ट क्या है?

डेटा स्ट्रक्चर मेमोरी में डेटा को सजाने का तरीक़ा है। लिंक्ड लिस्ट नोड की एक ज़ंजीर है। हर नोड में:

head वेरिएबल पहले नोड का पता रखता है। आख़िरी नोड का next NULL (Python में None) होता है, मतलब "आगे कोई नोड नहीं"। हम नोड को डिब्बा और पॉइंटर को तीर बनाते हैं: 12 → 7 → 25 → 3 → NULL।

लिंक्ड लिस्ट पुनरावर्ती (recursive) है: लिस्ट या तो ख़ाली है, या एक नोड + उसके बाद एक छोटी लिस्ट।

स्थिर (static) बनाम गतिशील (dynamic) मेमोरी

ऐरे स्थिर है: पहले से सटे हुए खानों का एक तय ब्लॉक लेते हैं। बढ़ाने के लिए सब कुछ बड़े ब्लॉक में कॉपी करना पड़ता है।

लिंक्ड लिस्ट गतिशील है: हर नोड ज़रूरत पड़ने पर ही बनता है (C/C++ में malloc/new, Python या Java में नया ऑब्जेक्ट) और हटाने पर मेमोरी लौट जाती है। नोड पास-पास होने ज़रूरी नहीं, क्योंकि हर नोड जानता है कि अगला कहाँ है।

लिस्ट को ऐरे के अंदर स्थिर रूप में भी बना सकते हैं: data[] और next[] ऐरे रखो, जहाँ next[i] अगले आइटम का इंडेक्स है (अंत के लिए −1)। परीक्षा में और बिना पॉइंटर वाली भाषाओं में यह आम है।

क्रियाएँ: ट्रैवर्स, इंसर्ट, डिलीट, सर्च, लंबाई

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

def push_front(head, x):
    n = Node(x); n.next = head
    return n   # नया head

लिंक्ड लिस्ट बनाम ऐरे, और इसका परिवार

ऐरेलिंक्ड लिस्ट
k-वाँ आइटमO(1) सीधी छलाँगO(k) चलना
शुरू में जोड़ना/हटानाO(n) खिसकानाO(1)
आकारतय या दोबारा कॉपीनोड-नोड बढ़ता है
अतिरिक्त मेमोरीनहींहर नोड में एक पॉइंटर

डबली लिंक्ड लिस्ट: हर नोड में prev पॉइंटर भी, ताकि पीछे भी चल सको। सर्कुलर लिस्ट: आख़िरी नोड वापस पहले को दिखाता है। स्टैक वह लिस्ट है जिसमें सिर्फ़ head पर push/pop होता है; क्यू में पीछे जोड़ते और आगे से हटाते हैं।

करके देखो

5 पर्चियों पर 5 संख्याएँ लिखो। हर पर्ची के पीछे लिखो कि कमरे में अगली पर्ची कहाँ छिपी है। दोस्त को सिर्फ़ पहली पर्ची (head) दो। देखो आख़िरी तक पहुँचने में कितना समय लगा। अब शुरू में एक नई पर्ची जोड़ो: तुम्हें क्या-क्या बदलना पड़ा?

मुख्य सूत्र और परिभाषाएँ

हल किए गए उदाहरण

1. लिस्ट: head → 4 → 9 → 2 → NULL। शुरू में 7 जोड़ो।

new(7).next = head (नोड 4); head = new। लिस्ट: 7 → 4 → 9 → 2 → NULL।

2. 4 → 9 → 2 में से 9 हटाओ।

p = नोड 4। p.next = p.next.next, अब 4 सीधे 2 को दिखाता है। लिस्ट: 4 → 2 → NULL।

3. 7 → 4 → 9 → 2 में 2 खोजने के लिए कितने नोड देखने पड़ेंगे?

head से: 7 (1), 4 (2), 9 (3), 2 (4)। 4 नोड।

4. स्थिर लिस्ट: data = [D, A, C, B], next = [−1, 3, 0, 2], head = 1। लिस्ट पढ़ो।

इंडेक्स 1 = A, next 3 = B, next 2 = C, next 0 = D, next −1 = अंत। लिस्ट: A → B → C → D।

5. 'p.next = new; new.next = p.next' ग़लत क्यों है?

पहली लाइन के बाद p.next तो new हो चुका, तो new.next = new बनता है: एक लूप, और बाक़ी लिस्ट खो जाती है। पहले new.next सेट करो।

आम गलतियाँ

अभ्यास क्विज़

1. सिंगली लिंक्ड लिस्ट के नोड में होता है:
2. आख़िरी नोड किसे दिखाता है?
3. लिंक्ड लिस्ट में शुरू में जोड़ने का समय:
4. कौन-सा काम ऐरे में लिंक्ड लिस्ट से तेज़ है?
5. p के बाद वाले नोड को हटाने के लिए:

अभ्यास: खुद जवाब दो

अपना जवाब लिखो या चुनो, फिर जाँचें दबाओ। अटको तो संकेत देखो; जवाब देने के बाद पूरा हल दिखेगा।

अक्सर पूछे जाने वाले प्रश्न

लिंक्ड लिस्ट आसान शब्दों में क्या है?

डिब्बों की एक ज़ंजीर, जिसमें हर डिब्बे में एक मान और अगले डिब्बे का पता है। head से शुरू करके पते पकड़ते चलते हैं।

ऐरे और लिंक्ड लिस्ट में क्या अंतर है?

ऐरे आइटम सटाकर रखता है और किसी भी इंडेक्स पर तुरंत पहुँचता है। लिंक्ड लिस्ट आइटम कहीं भी रखकर जोड़ती है, इसलिए जोड़ना-हटाना सस्ता पर पढ़ने के लिए चलना पड़ता है।

लिंक्ड लिस्ट के प्रकार कौन-से हैं?

सिंगली लिंक्ड, डबली लिंक्ड (next और prev) और सर्कुलर (आख़िरी नोड पहले को दिखाता है)।

यह कहाँ पढ़ाया जाता है

रोमानियाClasa a XI-aDynamic data structures
रोमानियाClasa a XI-aData structures
जर्मनीJahrgangsstufe 12Lists

पहले यह पढ़ें

आगे पढ़ें

इससे जुड़े पाठ

सभी कंप्यूटर विज्ञान पाठ