如何在不使用集合的情况下反向迭代链表?

时间:2016-10-06 05:43:09

标签: java iteration singly-linked-list

我正在浏览一个单独的链表 例如:1-> 2-> 3-> 4-> 5-> 6>

当它到达一个位置,如节点值4时,它返回到先前的位置值,如1或2.如何在不使用集合框架或反转链表的情况下向后遍历它?

3 个答案:

答案 0 :(得分:1)

您可以像对数组那样执行此操作,即使用循环。你唯一需要的是开始和结束指数。我已经定义了一个名为displayReverse()的方法,它以相反的顺序显示位置ab之间的节点整数。 (注意:a和b表示位置而NOT 指数。这意味着在您的情况下,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);

来自main方法。在您的情况下,输出应该是

4 3 2 1

编辑

  1. 如果您要执行除显示之外的任何操作,请将我的代码中的print语句替换为相应的语句。

  2. 确保为ab传递的值在链表的索引范围内。

答案 1 :(得分:0)

这个答案假设您正在实现自己的单链表类,并且实现类似于此:Singly Linked List in 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);
}

答案 2 :(得分:-1)

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;
}
}