算法-第四版-练习1.3.29解答

题目

用环形链表实现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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值