题目
用环形链表实现Queue。环形链表也是一条链表,只是没有任何结点链接为空,且只要链表非空则last.next的值就为first。只能使用一个Node类型的实例变量(last)。
分析
第一次写不出来.感觉要用first和last看了答案以后才发现也是可以的
出列时将last.next指向last.next.next。
入列时需要修改两条链接才能真正的让一个结点加入到一个环中。最后在移到last的位置。
待优化,出列后的结点应该修改其next为null。
java代码
package hk13;
import java.util.Iterator;
/**
* @description: ${description}
* @create: 2019-02-19
* 先进先出的队列
* 实例变量:只有1个last(Node)
* 方法:isEmpty size enqueue dequeue iterator
* 特殊之处:环形的last.next=first
**/
public class W_1_3_29<Item> implements Iterable {
@Override
public Iterator iterator() {
return new queueIterator();
}
//这个有问题了,用了可能出错
private class queueIterator implements Iterator<Item> {
@Override
public boolean hasNext() {
return last != null;
}
@Override
public Item next() {
Node current = last;
if (current == current.next) {
Item item = current.item;
current = null;
return item;
} else {
Item item = current.next.item;
last.next = last.next.next;
return item;
}
}
}
private class Node {
Item item;
Node next;
}
private Node last;
public void enqueue(Item item) {
//空链表的情况下添加一个节点,然后自己是自己的下个节点
if (last == null) {
last = new Node();
last.item = item;
last.next = last;
} else {//非空链表的情况下
Node newNode = new Node();//新节点
newNode.item = item;//新节点赋值
newNode.next = last.next;//操作1新节点接到首节点
last.next = newNode;//操作2.尾节点指向新节点
last = newNode;//操作3.尾节点改变指向,操作123看图
}
}
public Item dequeue() {
//当链表为空,则返回空
if (last == null) {
return null;
} else if (last.next == last) {//当链表只剩下一个节点,则取出数据后,把节点设置为null
Item item = last.item;
last = null;
return item;
} else {//其余情况是链表有多个节点
Item item = last.next.item;//记录首节点的值
last.next = last.next.next;//尾节点的next由首first节点改为second节点
return item;
}
}
public static void main(String[] args) {
W_1_3_29<String> queue = new W_1_3_29<>();
queue.enqueue("a");
queue.enqueue("b");
queue.enqueue("c");
queue.enqueue("e");
queue.enqueue("f");
String dequeue1 = queue.dequeue();
String dequeue2 = queue.dequeue();
String dequeue3 = queue.dequeue();
String dequeue4 = queue.dequeue();
String dequeue5 = queue.dequeue();
String dequeue6 = queue.dequeue();
System.out.println(dequeue1);
System.out.println(dequeue2);
System.out.println(dequeue3);
System.out.println(dequeue4);
System.out.println(dequeue5);
System.out.println(dequeue6);
}
}
运行结果
心得
把入列抽象为3个步骤
把出列同样的来抽象
有点抽象,第一次不好想象
待补充:
1迭代器不能用了.
2出列后的结点应该修改其next为null。