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


    问题

    用环形链表实现Queue。环形链表也是一条链表,只是没有任何结点链接为空,且只要链表非空则last.next的值就为first。只能使用一个Node类型的实例变量(last)。

    解决思路

    出列时将last.next指向last.next.next。入列时需要修改两条链接才能真正的让一个结点加入到一个环中。最后在移到last的位置。

    待优化,出列后的结点应该修改其next为null。

    代码

    /**
     * Description : 
     * Author      : mn@furzoom.com
     * Date        : Oct 25, 2016 11:39:46 AM
     * Copyright (c) 2013-2016, http://furzoom.com All Rights Reserved.
     */
    package com.furzoom.lab.algs.ch103;
    
    import java.util.Iterator;
    
    /**
     * ClassName    : CircleQueue <br>
     * Function     : TODO ADD FUNCTION. <br>
     * date         : Oct 25, 2016 11:39:46 AM <br>
     * 
     * @version 
     */
    public class CircleQueue<Item> implements Iterable<Item>
    {
        private Node last;
        
        private class Node
        {
            public Item item;
            public Node next;
        }
        
        public CircleQueue()
        {
            last = null;
        }
        
        public boolean isEmpty()
        {
            return last == null;
        }
        
        public Item dequeue()
        {
            if (isEmpty())
                return null;
            
            Item item = last.next.item;
            if (last.next == last)
            {
                last = null;
            }
            else
            {
                last.next = last.next.next;
            }
            return item;
        }
        
        public void enqueue(Item item)
        {
            Node node = new Node();
            node.item = item;
            if (last == null)
            {
                last = node;
                node.next = node;
            }
            else {
                node.next = last.next;
                last.next = node;
                last = node;
            }
        }
        
        @Override
        public Iterator<Item> iterator()
        {
            return new Iter();
        }
        
        private class Iter implements Iterator<Item>
        {
            private Node first;
            private boolean one;
            
            public Iter()
            {
                if (last == null)
                {
                    first = null;
                }
                else 
                {
                    first = last.next;
                    one = (last == last.next);
                }
            }
            @Override
            public boolean hasNext()
            {
                // if
                if (last == last.next)
                {
                    if (one)
                    {
                        one = false;
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    return first != null;
                }
            }
            @Override
            public Item next()
            {
                Item item;
                if (last == last.next)
                {
                    first = null;
                    item = last.item;
                }
                else
                {
                    item = first.item;
                    first = first.next;
                    if (first == last.next)
                    {
                        first = null;
                    }
                }
                return item;
            }
        }
    }
    

    测试代码:

    /**
     * Description : 
     * Author      : mn@furzoom.com
     * Date        : Oct 25, 2016 11:38:20 AM
     * Copyright (c) 2013-2016, http://furzoom.com All Rights Reserved.
     */
    package com.furzoom.lab.algs.ch103;
    
    import java.util.Iterator;
    
    /**
     * ClassName    : E10329 <br>
     * Function     : TODO ADD FUNCTION. <br>
     * date         : Oct 25, 2016 11:38:20 AM <br>
     * 
     * @version 
     */
    public class E10329
    {
        public static void main(String[] args)
        {
            CircleQueue<String> queue = new CircleQueue<String>();
            queue.enqueue("a");
            queue.enqueue("b");
            queue.enqueue("c");
            queue.enqueue("d");
            queue.enqueue("e");
            
            Iterator<?> it = queue.iterator();
            while (it.hasNext())
            {
                System.out.println(it.next());
            }
            System.out.println("dequeue: ");
            String s;
            while ((s = queue.dequeue()) != null)
            {
                System.out.println(s);
            }
        }
        
    }
    


    结果:

    a
    b
    c
    d
    e
    dequeue: 
    a
    b
    c
    d
    e
    


    算法-第四版-1.3 背包、队列和栈-习题索引汇总

    算法-第四版习题索引汇总


  • 相关阅读:
    史上最全的浏览器 CSS & JS Hack 手册
    JavaScript1.6数组新特性和JQuery的几个工具方法
    用jquery循环map
    javascript强大的日期函数
    用 javascript 判断 IE 版本号
    常见排序算法基于JS的实现
    JavaScript中callee,caller,argument的理解
    apply()方法和call()方法
    虽然我们可能不想对元素应用3D变换,可我们一样可以开启3D引擎
    在移动端上加上代码,让字体变得平滑
  • 原文地址:https://www.cnblogs.com/furzoom/p/7710173.html
Copyright © 2020-2023  润新知