注:本文代码出自《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);
} }

  如有问题,欢迎留言。

JAVA链表中迭代器的实现的更多相关文章

  1. Java集合中迭代器的常用用法

    该例子展示了一个Java集合中迭代器的常用用法public class LinkedListTest { public static void main(String[] args) { List&l ...

  2. Java List中迭代器遍历

    在java中,List接口从Collection接口中继承了 iterator()函数,返回值是一个T类型的迭代器(泛型),T是List中元素的类型 public class TestListAndI ...

  3. 设计模式学习笔记(十六)迭代器模式及其在Java 容器中的应用

    迭代器(Iterator)模式,也叫做游标(Cursor)模式.我们知道,在Java 容器中,为了提高容器遍历的方便性,把遍历逻辑从不同类型的集合类中抽取出来,避免向外部暴露集合容器的内部结构. 一. ...

  4. JAVA实现具有迭代器的线性表(单链表)

    一,迭代器的基本知识: 1,为什么要用迭代器?(迭代:即对每一个元素进行一次“问候”) 比如说,我们定义了一个ADT(抽象数据类型),作为ADT的一种实现,如单链表.而单链表的基本操作中,大部分需要用 ...

  5. java中迭代器应用

    本文将利用分析代码的方式,来学习一个集合类的内部结构,以及遍历集合的迭代模式的源码实现细节. 下面我们先简单讨论一个根接口Collection,然后分析一个抽象类AbstractList和它的对应It ...

  6. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  7. 小学生之Java中迭代器实现的原理

    一. 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生.我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator();wh ...

  8. Java中迭代器Iterator的使用

    Java集合类中Map接口下的相关类并没有像Collection接口的相关类一样实现get()方法,因此在要实现遍历输出的场景中没法直接用get()方法来取得对象中的数据,但Java本身提供了另一种遍 ...

  9. 面试中的Java链表

    链表作为常考的面试题,并且本身比较灵活,对指针的应用较多.本文对常见的链表面试题Java实现做了整理. 链表节点定义如下: static class Node { int num; Node next ...

随机推荐

  1. centos7下安装docker(12.3容器之间的连通性)

    我们接着盗图,如下: 在这张图上,可以看到,如果两个容器使用同一个bridge,那么两个容器之间是互相能通的 可以看到两个容器在同一个bridge下是可以互相ping通的 当两个容器在不同的bridg ...

  2. Arduino IDE for ESP8266 项目云盒子 (1)AP直接模式

    手机直接连接esp8266辐射的WIFI,通信. https://item.taobao.com/item.htm?spm=a230r.1.14.20.eYblO3&id=5219451024 ...

  3. VS2013+QT5.3 中文乱码和中文路径不识别

    http://blog.csdn.net/brave_heart_lxl/article/details/7186631 ubun图中文乱码 https://blog.csdn.net/u013007 ...

  4. Echo团队Alpha冲刺随笔 - 第一天

    项目冲刺情况 进展 每个人开始搭建自己要用的各种框架.库,基本实现了登录功能 问题 除了框架使用问题外,暂未遇到其他疑难杂症 心得 今天有一个还可以的开头,相信后续会挺顺利的 今日会议内容 黄少勇 今 ...

  5. 【Codeforces Gym 100725K】Key Insertion

    Codeforces Gym 100725K 题意:给定一个初始全0的序列,然后给\(n\)个查询,每一次调用\(Insert(L_i,i)\),其中\(Insert(L,K)\)表示在第L位插入K, ...

  6. VisualStudio2008+水晶报表的使用

    1:打开VisualStudio2008,新建一个Windows窗体应用程序项目,名称可以自定义,选择项目的保存路径,然后确定 刚新建好的窗体应用程序: 2. 把准备好的水晶报表插件复制到项目中的bi ...

  7. eclipse 报错Version 1.6.0_45 of the JVM is not suitable for this product. Version:1.7 or greater is required

    最近离职来了一家新公司,之前的公司的开发IDE用的是IntelliJIDEA和SpringSourceToolSuit,自己在家里用的也是MyEclipse,所以使用eclipse的经验还是不足.结果 ...

  8. Spring Boot 之属性读写详解

    SpringBoot 之属性读写详解 加载 property 顺序 随机属性 命令行属性 Application 属性文件 Profile 特定属性 属性中的占位符 YAML 属性 访问属性 多 pr ...

  9. BZOJ1767/Gym207383I CEOI2009 Harbingers 斜率优化、可持久化单调栈、二分

    传送门--BZOJCH 传送门--VJ 注:本题在BZOJ上是权限题,在Gym里面也不能直接看,所以只能在VJ上交了-- 不难考虑到这是一个\(dp\). 设\(dep_x\)表示\(x\)在树上的带 ...

  10. 【JVM.5】类文件结构

    鲁迅曾经说过:代码编译的结构从本地机器码转变为字节码,是存储格式发展的一小步,确是编程语言发展的一大步. 一.无关性的基石 Java设计者在最初就承诺过“In the future, we will ...