zoukankan      html  css  js  c++  java
  • JAVA链表中迭代器的实现

      注:本文代码出自《java数据结构和算法》一书。

      PS:本文中类的名字定义存在问题,Link9应改为Link、LinkList9应该为LinkList。由于在同包下存在该名称,所以在后面接了数字。

    迭代器:

      加入我们需要遍历一个链表,并在某些特定的链接点上执行一些操作。比如,你要搜索链表存储的员工表,所有员工工资为最低的员工,并为其加薪1000元。在数组中,由于数组下标可以跟踪所在位置,这种操作就很容易,然而在链表中,没有固定的下标,我们如何实现?且看下文:

    迭代器类:

      迭代器类包含对数据结构中数据项的引用,用来遍历这些结构的对象,定义如下代码中的class ListIterator。current字段包含迭代器当前指向的链接点的一个引用。为了使用这样的迭代器用户可以创建一个链表,然后创建一个和链表相关联的迭代器对象。创建迭代器对象后,就可以通过它存取它指向的链接点,或者递增它以指向下一个链接点。

    迭代器的方法:

      reset()------------------>把迭代器设在表头

      nextLink()--------------->把迭代器移动到下一个链接点

      getCurrent()------------->返回迭代器所指的链接点

      atEnd()------------------>如果迭代器达到表尾,返回true

      insertAfter()------------->在迭代器后面插入一个新的链接点

      insertBefore()----------->在迭代器前面插入一个新的链接点

      deleteCurrent()---------->删除迭代器所指的链接点

    不多说,直接上代码:  

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    import test_4_19.system;
    
    /**
     * java链表中迭代器的实现
     * 2017年5月2号17:25
     * @author zcj
     *
     */
    
    class Link9
    {
        public long dData;
        public Link9 next;
        
        public Link9(long dd)
        {
            dData = dd;
        }
        public void displayLink()
        {
            System.out.print(dData + " ");
        }
    }
    
    class LinkList9
    {
        private Link9 first;
        
        public LinkList9()
        {
            first = null;
        }
        
        public Link9 getFirst()//获取链表的first
        {
            return first;
        }
        public void setFirst(Link9 f)//由于在迭代器里面first可能会改变,所以需要LinkList中提供first改变的方法
        {
            first = f;
        }
        public boolean isEmpty()
        {
            return first==null;
        }
        public ListIterator getIterator()
        {
            return new ListIterator(this);
        }
        
        public void dispalyList()
        {
            Link9 current = first;
            while(current != null)
            {
                current.displayLink();
                current = current.next;
            }
            System.out.println("");
        }
    }
    
    class ListIterator
    {
        private Link9 current;
        private Link9 previous;
        private LinkList9 ourList;
        
        public ListIterator(LinkList9 list)
        {
            ourList = list;
            reset();
        }
        
        public void reset()//把迭代器复位,并放在表头
        {
            current = ourList.getFirst();
            previous = null;
        }
        public boolean atEnd()//判断当前节点是否为最后一个链节点
        {
            return (current.next == null);
        }
        public void nextLink()//到下一个链接点
        {
            previous = current;
            current = current.next;
        }
        public Link9 getCurrent()//得到当前链接点的内容
        {
            return current;
        }
        
        public void insertAfter(long dd)//在当前链接点后插入新的链节点
        {
            Link9 newLink = new Link9(dd);
            
            if(ourList.isEmpty())
            {
                ourList.setFirst(newLink);
                current = newLink;
            }
            else {
                newLink.next = current.next;
                current.next = newLink;
                nextLink();
            }
        }
        public void insertBefore(long dd)//在当前链接点前插入新的链节点
        {
            Link9 newLink = new Link9(dd);
            
            if(previous == null)
            {
                newLink.next = ourList.getFirst();
                ourList.setFirst(newLink);
                reset();
            }
            else {
                newLink.next = previous.next;
                previous.next = newLink;
                current = newLink;
            }
        }
        public long deleteCurrent()//删除当前链节点
        {
            long value = current.dData;
            if(previous == null)
            {
                ourList.setFirst(current.next);
                reset();
            }
            else {
                previous.next = current.next;
                if(atEnd())
                    reset();
                else 
                    current = current.next;
            }
            return value;
        }
    }
    public class interIterator5_9 {
    
        /**
         * @param args
         * @throws IOException 
         */
        public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub
            LinkList9 theList = new LinkList9();
            ListIterator iter1 = theList.getIterator();
            long value;
            
            iter1.insertAfter(20);
            iter1.insertAfter(40);
            iter1.insertAfter(80);
            iter1.insertBefore(60);
            
            while(true)
            {
                System.out.println("Enter first letter of ");
                System.out.print("show,reset,next,get,before,after,delete: ");
                System.out.flush();
                int choice = getChar();
                switch (choice) {
                case 's':
                    if(!theList.isEmpty())
                        theList.dispalyList();
                    else 
                        System.out.println("List is empty!");
                    break;
    
                case 'r':
                    iter1.reset();
                    break;
                case 'n':
                    if(!theList.isEmpty() && !iter1.atEnd())
                        iter1.nextLink();
                    else 
                        System.out.println("can't go to nextLink");
                    break;
                case 'g':
                    if(!theList.isEmpty())
                    {
                        value = iter1.getCurrent().dData;
                        System.out.println("returned" + value);
                    }
                    else 
                        System.out.println("List is Empty");
                    break;
                case 'b':
                    System.out.println("Enter value to insert: ");
                    System.out.flush();
                    value = getInt();
                    iter1.insertBefore(value);
                    break;
                case 'a':
                    System.out.println("Enter value to insert: ");
                    System.out.flush();
                    value = getInt();
                    iter1.insertAfter(value);
                    break;
                case 'd':
                    if(!theList.isEmpty())
                    {
                        value = iter1.deleteCurrent();
                        System.out.println("Deleted" + value);
                    }
                    else 
                        System.out.println("Can't delete");
                    break;
                default:
                    System.out.println("Invalid entry");
                }
            }
        }
        public static String getString() throws IOException
        {
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            String s = br.readLine();
            return s;
        }
        public static char getChar() throws IOException
        {
            String s = getString();
            return s.charAt(0);
        }
        public static int getInt() throws IOException
        {
            String s = getString();
            return Integer.parseInt(s);
        }
    
    }

      如有问题,欢迎留言。

  • 相关阅读:
    01开卡主流程
    eclipse开发工程右键菜单例子
    eclipse插件开发需要什么
    installshield安装程序自注册dll
    eclipse开发视图
    vbscript和cmd命令 如何获取当前文件的路径
    eclipse开发视图
    vbscript和cmd命令 如何获取当前文件的路径
    vbscript设置环境变量
    eclipse开发工程右键菜单例子
  • 原文地址:https://www.cnblogs.com/zchenjian/p/6800722.html
Copyright © 2011-2022 走看看