我正在浏览一个单独的链表 例如:1-> 2-> 3-> 4-> 5-> 6>
当它到达一个位置,如节点值4时,它返回到先前的位置值,如1或2.如何在不使用集合框架或反转链表的情况下向后遍历它?
答案 0 :(得分:1)
您可以像对数组那样执行此操作,即使用循环。你唯一需要的是开始和结束指数。我已经定义了一个名为displayReverse()
的方法,它以相反的顺序显示位置a
和b
之间的节点整数。 (注意: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
编辑
如果您要执行除显示之外的任何操作,请将我的代码中的print语句替换为相应的语句。
确保为a
和b
传递的值在链表的索引范围内。
答案 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;
}
}