注:本文代码出自《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. ES 使用小结

    ES 是 Elastic Search 的缩写,可以理解为一个支持分布式部署的软件. 部署了以后可以当数据库用,虽然官方不建议这样做,但我们是这样干的. 它解决了很多场景下的查询需求,发版速度飞快,用 ...

  2. 17秋 软件工程 团队第五次作业 Alpha Scrum8

    17秋 软件工程 团队第五次作业 Alpha Scrum8 今日完成的任务 世强:部门人员管理界面设计编写: 港晨:设计主页面: 树民:web后端框架与前端对接: 伟航:app前端界面的美工: 陈翔: ...

  3. JMETER content-type增加

    Jmeter—3 http请求—content-type与参数 本文讲三种content-type以及在Jmeter中对应的参数输入方式 第一部分:目前工作中涉及到的content-type 有三种: ...

  4. 错误: 无法访问InstrumentationTestRunner 找不到android.test.InstrumentationTestRunner的类文件

    错误: 无法访问InstrumentationTestRunner找不到android.test.InstrumentationTestRunner的类文件

  5. Server版Linux命令提示符揭秘

            一直都在Ubuntu12.04和12.10  Desktop下玩.如今要在Centos6.3 Server版下做开发了,感觉还是非常不一样的. 克服一个有一个不顺利后,有那种站在山顶的 ...

  6. 如何用命令行刷新,启用,禁用Magento2的缓存

    当你使用Magento商店时如何刷新Magento 2中的Cache命令行是基本的常用操作.Magento 2默认有12种缓存类型.在命令行中有5个简单的命令来管理缓存.在这篇文章中,我将逐步向您展示 ...

  7. [ZJOI2005]午餐

    嘟嘟嘟 贪心+dp. 首先贪心很容易想到,把吃饭时间长的人排在前面.因为打饭时间的顺序对最终答案没有影响,所以可以以吃饭时间为关键字排序. 然后就是dp了(我当时还自信满满的贪心交了一发--显然WA啊 ...

  8. go标准库的学习-encoding/xml

    参考:https://studygolang.com/pkgdoc 导入方式: import "encoding/xml" 实现的简单的理解XML命名空间的XML 1.0编译器 f ...

  9. gitlab--ci文件

    1.when: manual  手动执行(加到哪个脚本中,哪个就会变成手动执行)

  10. 如何在Qt Creator中导入图标资源

    本文主要描述如何在Qt Creator中创建资源文件,并的打入导入图标文件. 查看图标资源文件时,可以在项目的工程文件上鼠标单击右键-Open With-资源编辑器,效果如下图所示: 在项目的工程文件 ...