Java Academy · पाठ

ListIterator और Bidirectional Traversal

ListIterator से lists पर आगे और पीछे जाएँ तथा iteration के दौरान elements में बदलाव करें।

पाठ 3, कुल 4 में से14 चरण

ListIterator और Bidirectional Traversal, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

ListIterator

ListIterator<T>, Iterator<T> का विस्तार करते हुए पीछे की ओर संचरण, सूचकांक-आधारित स्थिति-निर्धारण और पुनरावृत्ति के दौरान तत्व जोड़ने तथा बदलने की क्षमता प्रदान करता है।

ListIterator एपीआई

Iterator से अतिरिक्त विधियाँ: hasPrevious(), previous(), nextIndex(), previousIndex(), set(), add().

import java.util.*;

List<String> list = new ArrayList<>(List.of("A", "B", "C", "D"));
ListIterator<String> lit = list.listIterator();

// Forward traversal
while (lit.hasNext()) {
    System.out.print(lit.nextIndex() + ":" + lit.next() + " ");
}
// 0:A 1:B 2:C 3:D

System.out.println();

// Backward traversal
while (lit.hasPrevious()) {
    System.out.print(lit.previousIndex() + ":" + lit.previous() + " ");
}
// 3:D 2:C 1:B 0:A

किसी स्थिति से प्रारंभ करना

listIterator(index) की सहायता से किसी विशिष्ट index से शुरू होने वाला ListIterator बनाएँ।

List<Integer> nums = new ArrayList<>(List.of(10, 20, 30, 40, 50));

// Start at index 2 (30)
ListIterator<Integer> lit = nums.listIterator(2);

System.out.println(lit.next());     // 30
System.out.println(lit.next());     // 40
System.out.println(lit.previous()); // 40
System.out.println(lit.previous()); // 30
System.out.println(lit.previous()); // 20

पुनरावृत्ति के दौरान set()

set(), next() या previous() द्वारा लौटाए गए अंतिम तत्व को बदल देता है। यह दक्ष है — LinkedList के लिए O(1) और ArrayList के लिए O(1)।

List<String> words = new ArrayList<>(List.of("hello", "world", "java"));
ListIterator<String> lit = words.listIterator();

while (lit.hasNext()) {
    String word = lit.next();
    lit.set(word.toUpperCase()); // replace each with uppercase
}

System.out.println(words); // [HELLO, WORLD, JAVA]

पुनरावृत्ति के दौरान add()

add(element) अगले स्थान से पहले तत्व डालता है। जोड़ा गया तत्व अगली next() कॉल द्वारा वापस नहीं किया जाता — वह पहले ही कर्सर के "पीछे" आ चुका होता है।

List<Integer> numbers = new ArrayList<>(List.of(1, 2, 3));
ListIterator<Integer> lit = numbers.listIterator();

while (lit.hasNext()) {
    int n = lit.next();
    lit.add(n * 10); // insert n*10 after each element
}

System.out.println(numbers); // [1, 10, 2, 20, 3, 30]

सूची को उसी स्थान पर उलटना

नई सूची बनाए बिना O(n) में सूची को उलटने के लिए ListIterator का उपयोग करना।

static <T> void reverse(List<T> list) {
    ListIterator<T> front = list.listIterator(0);
    ListIterator<T> back  = list.listIterator(list.size());

    for (int i = 0, n = list.size() / 2; i < n; i++) {
        T frontVal = front.next();
        T backVal  = back.previous();
        front.set(backVal);
        back.set(frontVal);
    }
}

List<String> data = new ArrayList<>(List.of("a","b","c","d","e"));
reverse(data);
System.out.println(data); // [e, d, c, b, a]

nextIndex और previousIndex

nextIndex() उस तत्व का index लौटाता है जिसे next() लौटाएगा। previousIndex() उस तत्व का index लौटाता है जिसे previous() लौटाएगा।

List<String> list = List.of("X", "Y", "Z");
ListIterator<String> lit = list.listIterator();

System.out.println(lit.nextIndex());     // 0
System.out.println(lit.previousIndex()); // -1 (before start)

lit.next(); // consume X
System.out.println(lit.nextIndex());     // 1
System.out.println(lit.previousIndex()); // 0

LinkedList ListIterator का प्रदर्शन

LinkedList का ListIterator pointer का अनुसरण करने के कारण O(1) next/previous प्राप्त करता है। LinkedList पर get(i) O(n) है — कुशलतापूर्वक आगे बढ़ने के लिए ListIterator का उपयोग करें।

import java.util.*;

LinkedList<Integer> list = new LinkedList<>();
for (int i = 0; i < 5; i++) list.add(i * 10);

// Efficient: O(n) total for traversal via ListIterator
ListIterator<Integer> lit = list.listIterator();
while (lit.hasNext()) {
    int val = lit.next();
    if (val == 20) lit.set(99); // O(1) update
}
System.out.println(list); // [0, 10, 99, 30, 40]

ListIterator से पैलिंड्रोम जाँचना

दो दिशाओं में आगे बढ़ने का एक सुंदर उदाहरण: यह जाँचना कि कोई सूची पैलिंड्रोम है या नहीं।

static <T> boolean isPalindrome(List<T> list) {
    ListIterator<T> front = list.listIterator(0);
    ListIterator<T> back  = list.listIterator(list.size());

    for (int i = 0, n = list.size() / 2; i < n; i++) {
        if (!front.next().equals(back.previous())) return false;
    }
    return true;
}

System.out.println(isPalindrome(List.of(1, 2, 3, 2, 1))); // true
System.out.println(isPalindrome(List.of(1, 2, 3, 4)));    // false

Iterator और ListIterator की तुलना

मुख्य अंतर:

  • Iterator: केवल आगे की दिशा, hasNext/next/remove
  • ListIterator: दोनों दिशाओं में, hasPrevious/previous, nextIndex/previousIndex, set/add
  • ListIterator केवल सूचियों के लिए है (Set और Queue के लिए नहीं)

ListIterator से पूर्ववत् और फिर से करना

कर्सर-आधारित टेक्स्ट संपादक, जो वर्णों के बीच कुशलतापूर्वक आगे-पीछे जाने के लिए ListIterator का उपयोग करता है और किए गए कार्यों को पूर्ववत् या फिर से कर सकता है।

import java.util.*;

class TextEditor {
    private final LinkedList<Character> chars = new LinkedList<>();
    private ListIterator<Character> cursor;

    TextEditor() { cursor = chars.listIterator(); }

    void type(char c) { cursor.add(c); } // insert before cursor

    void moveCursorLeft()  { if (cursor.hasPrevious()) cursor.previous(); }
    void moveCursorRight() { if (cursor.hasNext()) cursor.next(); }

    void backspace() {
        if (cursor.hasPrevious()) { cursor.previous(); cursor.remove(); }
    }

    String text() {
        StringBuilder sb = new StringBuilder();
        chars.forEach(sb::append);
        return sb.toString();
    }
}

TextEditor ed = new TextEditor();
ed.type('H'); ed.type('e'); ed.type('l'); ed.type('o');
ed.moveCursorLeft(); ed.moveCursorLeft();
ed.type('l');
System.out.println(ed.text()); // Hello

ListIterator का उपयोग कब करें

ListIterator का उपयोग तब करें जब आपको चाहिए:

  • सूची में पीछे की ओर जाना
  • पुनरावृत्ति के दौरान set() से तत्वों को बदलना
  • पुनरावृत्ति के दौरान add() से तत्व डालना
  • nextIndex()/previousIndex() के माध्यम से स्थिति पर नज़र रखना

त्वरित जाँच

ListIterator.set() क्या करता है?

पुनरावलोकन: ListIterator और दोनों दिशाओं में पुनरावृत्ति

मुख्य बातें:

  • ListIterator, hasPrevious(), previous(), set(), add() के साथ Iterator का विस्तार करता है
  • किसी विशिष्ट स्थिति पर ListIterator बनाएँ: listIterator(index)
  • set(), next() या previous() द्वारा लौटाए गए अंतिम तत्व को बदलता है
  • add(), वर्तमान कर्सर स्थिति से पहले तत्व डालता है
  • nextIndex() और previousIndex() स्थिति की जानकारी देते हैं
  • O(1) पुनरावृत्ति और संशोधन के लिए LinkedList ListIterator का उपयोग करें
शुरुआत निःशुल्क

एआई शिक्षक के साथ Java सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
104
पाठ
374

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

क्या “ListIterator और Bidirectional Traversal” पाठ निःशुल्क है?

हाँ—“ListIterator और Bidirectional Traversal” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“ListIterator और Bidirectional Traversal” में मैं क्या सीखूँगा?

ListIterator से lists पर आगे और पीछे जाएँ तथा iteration के दौरान elements में बदलाव करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“ListIterator और Bidirectional Traversal” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Iterable और Iterator Contracts
  2. Custom Iterator लागू करना
  3. ListIterator और Bidirectional Traversal
  4. Fail-Fast बनाम Fail-Safe Iterators
← Java Academy पर वापस जाएँ