Как отменить итерацию связанного списка без использования коллекции?
Я перебираю односвязный список, например: 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
РЕДАКТИРОВАТЬ
Если вы хотите сделать что-то еще, кроме его отображения, замените оператор print в моем коде соответствующим оператором (ами).
Убедитесь, что значения переданы для
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;
}
}