📅  最后修改于: 2023-12-03 15:39:08.700000             🧑  作者: Mango
链表是一种常见的数据结构,但遍历链表时常常需要使用循环语句。为了提高代码的可读性和灵活性,可以使用迭代器模式实现链表的遍历。
本文将介绍如何通过迭代器模式实现链表的迭代器。
迭代器模式是一种行为型设计模式,它可以将集合对象的访问与遍历分离开来,从而使得遍历算法能够独立于集合对象而变化。
迭代器模式一般包含以下几个角色:
以下是实现链表的迭代器的关键代码片段:
public class LinkedList<E> implements Iterable<E> {
private Node<E> head;
private int size;
public LinkedList() {
head = null;
size = 0;
}
@Override
public Iterator<E> iterator() {
return new LinkedListIterator<E>(head);
}
private static class LinkedListIterator<E> implements Iterator<E> {
private Node<E> current;
public LinkedListIterator(Node<E> head) {
current = head;
}
@Override
public boolean hasNext() {
return current != null;
}
@Override
public E next() {
E element = current.element;
current = current.next;
return element;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
private static class Node<E> {
E element;
Node<E> next;
public Node(E element, Node<E> next) {
this.element = element;
this.next = next;
}
}
}
在上述代码中,我们定义了一个 LinkedList 类,并实现了 Iterable 接口,该接口定义了 iterator() 方法,该方法返回一个迭代器对象。
我们还定义了一个 LinkedListIterator 类,它实现了 Iterator 接口。在构造方法中,我们将头结点作为参数传入,将 current 指针指向头结点。
在 hasNext() 方法中,我们判断 current 是否为 null,以判断是否到达链表末尾。
在 next() 方法中,我们先获取当前节点的元素值,再将 current 指针后移一位,以便下次遍历。
在 remove() 方法中,我们直接抛出一个 UnsupportedOperationException 异常,因为链表一般不支持删除操作。
以下是使用链表迭代器的示例:
LinkedList<Integer> list = new LinkedList<Integer>();
list.add(1);
list.add(2);
list.add(3);
for (Integer n : list) {
System.out.print(n + " ");
}
// Output: 1 2 3
在上述代码中,我们创建了一个链表对象 list,并添加了三个元素。然后通过 for-each 循环遍历链表,输出其元素。
通过实现迭代器模式,可以使得遍历链表的代码更加简洁、易读,并可以灵活地改变遍历算法。