2014-03-03 61 views
0

我需要通过这个自定义linked list implementation遍历并显示其内容:遍历链表尾头

  • 从头部到尾部,
  • 然后再次从尾到头部。

我能够显示从头部列表内容尾部与一个漂亮容易for循环:

 for (AccountRecordSerializable account : list) { 
      System.out.println(account); 
     } 

,一切工作正常。现在我试图扭转这种情况。在提供的LinkedList类中使用其中也有一个LinkedListIterator类。迭代器类有方法,如hasNext(),hasPrevious(),我知道可以这样做,但我不太清楚如何通过我的LinkedList使用该迭代器来这样做。

是否有一种更简单的方法,正如我以前所做的那样来扭转这种情况?或者,我将如何使用Iterator类遍历我的列表,以便它执行任务?

我很抱歉,如果这没有任何意义...让我知道你是否需要澄清..谢谢。

+0

这显然是您的描述中的一个非JDK类;您需要在您的实现中至少发布代码以用于Iterator类。 –

+0

这是在for +每个循环,所以它实现了Iterable ,所以它提供了一个迭代器,它是JDK –

+0

好吧,有很多,我不想泛滥的页面,所以我会设置一个外部链接 – Luminusss

回答

1

Java LinkedList实现了接口Deque,它提供了方法descendingIterator

以相反顺序返回此双端队列中元素的迭代器。元素将从上一个(尾)到第一个(头)的顺序返回。

我的建议是在你的类中实现接口,并获得反转迭代器。

linked list是一些数据结构,包含一些您应该用来获取实现的属性。链表的典型结构是一个元素指向下一个元素。你的情况你有支持双链表的实现。

private int size = 0; // size can never be < 0 
private DLNode<E> head; 
private DLNode<E> tail; 

在代码中,您有代表双链接节点的DLNode。这意味着您可以使用hasNex()head移动到tail,并使用hasPrevious()从尾部移动到头部。

在你的类,你有类LinkedListIterator,你可以用这种方法获得:

public ListIterator<E> listIterator(int index) { 
    if ((index < 0) || (index > size)) { 
     throw new IndexOutOfBoundsException("index " + index+ " is out of range: 0 to " + size); 
    } 
    return new LinkedListIterator<E>(index); 
} 

所以要打印的元素,你可以不喜欢这样。

public <T> void printLinkedListFromHead(LinkedList<T> list) { 

    for(ListIterator<T> iterator = list.listIterator(0); iterator.hasNext();) { 
     System.out.println(iterator.next()); 
    } 

} 

您还应该为您的代码创建一个单独的类,您将在其中上下文不属于链表实现的代码。方法readObjectswriteObjects不属于类。与主要相同。


,如果您有标准的Java的LinkedList,你可以写这样的事情:

public <T> reversePrint(Deque deque) { 

for (Iterator<T> iterator = deque.descendingIterator(); iterator .hasNext();){ 
     System.out.println(iterator .next()); 
    } 
} 

要缩小迭代的范围促进循环比,同时。

+0

对不起,试图理解这里的逆转部分。所以在这个例子中,通过的是什么?我对德克不是很熟悉。 – Luminusss

+0

'Deque'是'LinkedList'中实现的一个接口。 'Deque'允许获取降序迭代器。 –

0

使用.descendingIterator()会做你想要什么:)

例子:

LinkedList<Integer> linkedList = new LinkedList<Integer>(); 
linkedList.add(1); 
linkedList.add(2); 
linkedList.add(3); 


Iterator<Integer> iterator = linkedList.descendingIterator(); 
while (iterator.hasNext()) 
{ 
    System.out.println(iterator.next()); 
} 

如果要保存新的LinkedList逆转..只是

LinkedList<Integer> linkedList = new LinkedList<Integer>(); 
linkedList.add(1); 
linkedList.add(2); 
linkedList.add(3); 


Iterator<Integer> iterator = linkedList.descendingIterator(); 
LinkedList<Integer> reversed = new LinkedList<Integer>(); 
while (iterator.hasNext()) 
{ 
    reversed.add(iterator.next()); 
} 
+0

唯一的是我有一个为我创建的迭代器类,我可能需要使用(似乎是多余的)。我不认为我可以用它创建一个迭代器对象 – Luminusss

+0

我不明白为什么有人只是低估了它,因为这个答案说如何以相反的顺序迭代它,但无论如何:所以你正在使用你的LinkedList实现? –

+0

投票回滚。为什么我这么做?您使用while循环而不是for循环的方式。并且可以改进如何复制以反转源列表的方法。 –

1

单链表是不意味着从尾部到头部。有几个选项你有

  1. 反向链接列表并遍历从头到尾(这将是尾巴头为原始链接列表)
  2. 有一个堆栈。遍历链表并将元素放入堆栈。然后继续弹出堆栈中的元素并打印。
+0

是的,这是一项任务,我需要这样做。 – Luminusss

+0

你是对的,但你的回答是错误的。链接到问题的源代码显示OP具有双重链接列表。 –

1

我决定只是通过将光标指向列表的末尾并使用get(index)进行迭代,然后递减。这是我有:

 System.out.println("Tail to Head"); 
     for (int i = list.size - 1; list.get(i) != null; i--) { 
       System.out.println(list.get(i)); 
       if (i == 0){ 
        break; 
       } 
      } 

我敢肯定,有更漂亮的方式来写它,但它现在履行其目的。