Как отменить итерацию связанного списка без использования коллекции?

Я перебираю односвязный список, например: 1->2->3->4->5->6>

Когда он достигает позиции, скажем, значения узла 4, он возвращается к предыдущим значениям позиции, таким как 1 или 2. Как пройти через это в обратном направлении, не используя структуру сбора или не переворачивая связанный список?

3 ответа

Вы можете сделать это так же, как для массива, то есть, используя цикл. Единственное, что вам нужно, это начальные и конечные показатели. Я определил метод под названием displayReverse() который отображает целые числа узлов между позициями a а также b в обратном порядке. (Примечание: a и b указывают позиции, а не индексы. Это означает, что в вашем случае, 1 находится в положении 1 .)

public void displayReverse(int a, int b){
    //Node t holds the node at the beginning index
    Node t = start;
    for(int i=2; i<=a; i++)
        t=t.link;

    for(int i=b; i>=a; i--){
        Node x = t;
        int s = a;
        while(s<=i && x.link != null) {
            if(s != a)
                x = x.link;
            s++;
        }
        System.out.print(x.d + " ");
    }
}

Если вы хотите отобразить из позиции 4 (то есть, индекс 3) в позицию 1 (то есть, индекс 0), вам нужно вызвать

myLinkedList.displayReverse(1,4);

из основного метода. В вашем случае вывод должен быть

4 3 2 1

РЕДАКТИРОВАТЬ

  1. Если вы хотите сделать что-то еще, кроме его отображения, замените оператор print в моем коде соответствующим оператором (ами).

  2. Убедитесь, что значения переданы для a а также b находятся в пределах индекса связанного списка.

В этом ответе предполагается, что вы реализуете свой собственный класс односвязных списков, и что он реализован примерно так: Односвязный список в Java

Добавьте в класс связанного списка поле (или расширьте класс), представляющее текущий индекс в вашем списке. Допустим, что при построении этот индекс устанавливается в 0. Затем добавьте методы getNextObject() и getPreviousObject(), которые будут смотреть на ранее упомянутый индекс, увеличивать или уменьшать его и возвращать объект в новой позиции индекса.

Редактировать:

Помните, что это пример, созданный без знания ваших реальных классов и не проверяющий, находится ли индекс вне границ.

Допустим, ваш класс LinkedList может реализовать интерфейс:

public interface IMyLinkedList{
    object getObjectAt(int index);
}

Вы можете создать класс LinkedListTraverser следующим образом:

public class LinkedListTraverser{
    private IMyLinkedList myLinkedList;
    private int internalIndex;

    public LinkedListTraverser(){
        this.internalIndex = 0;
        // your linked list class, you can pass data as constructor parameters for example
        this.myLinkedList = new LinkedList(); 
    }

    public object getObjectAt(int index){
        this.internalIndex = index;
        return myLinkedList.getObjectAt(index)
    }

    public object getNext(){
        return myLinkedList.getObjectAt(++internalIndex);
    }

    public object getPrevious(){
        return myLinkedList.getObjectAt(--internalIndex);
    }
}

Теперь вы можете перебирать свой связанный список следующим образом:

LinkedListTraverser linkedListTraverser = new LinkedListTraverser();
object myObject;

while(goForward){    
    if(shouldGoForward){    
        myObject = linkedListTraverser.getNext();
    }else{
        myObject = linkedListTraverser.getPrevious();
    }

    doWorkOnObject(myObject);
}
LinkedList yourObject = .... ;
int desire = 4; //Enter Your Desire Digit
for(int a = 0; a < yourObject.Length; a++){
if(yourObject.get(a) == desire){
for(int b = desire; b = 0; b--){
System.Out.Println(yourObject.get(b));
 }
 break;
}
}
Другие вопросы по тегам