注:本文代码出自《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. Hibernate Tools生成注释

    原文:http://www.blogjava.net/pauliz/archive/2009/11/13/302162.html 有同学需要修改后的Hibernate Tools整个tool我就不上传 ...

  2. web socket RFC6455 frame 打包、解包

    #ifndef __APP_WEBSOCKET_FRAME_H__ #define __APP_WEBSOCKET_FRAME_H__ #include "memory.hpp" ...

  3. 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165318

    2018-2019-2 <网络对抗技术>Exp0 Kali安装 Week1 20165318 下载地址 Kali官网,选择Kali Linux 64 bit VMware 安装步骤 以下步 ...

  4. Oracle 批量生成sys_guid()

    select sys_guid() from dual connect by rownum<10

  5. day14 Python函数

    函数def,严格来讲有个return返回值 过程就是没有return返回值的函数 #过程 def test01(): msg = 'liuhaoran' print(msg) #函数 def test ...

  6. 我是怎样和Linux系统结缘并通过红帽RHCE认证的

    我高考完当时就是选择的计算机科学与技术专业,上大学以后联想到的和计算机相关的就只有写代码,开发,网站,网页设计,就没有其他的了,当时学习写代码也都是在Windows上,什么C#.C++之类的?大约在大 ...

  7. 【Codeforces Round 1129】Alex Lopashev Thanks-Round (Div. 1)

    Codeforces Round 1129 这场模拟比赛做了\(A1\).\(A2\).\(B\).\(C\),\(Div.1\)排名40. \(A\)题是道贪心,可以考虑每一个站点是分开来的,把目的 ...

  8. DNS主从复制及区域传送

    前言 DNS主从复制,就是将主DNS服务器的解析库复制传送至从DNS服务器,进而从服务器就可以进行正向.反向解析了.从服务器向主服务器查询更新数据,保证数据一致性,此为区域传送.也可以说,DNS区域传 ...

  9. 学习CSS布局 - 没有布局

    如果你只想把所有内容都塞进一栏里,那么不用设置任何布局也是OK的. 然而,如果用户把浏览器窗口调整的很大,这时阅读网页会非常难受: 读完每一行之后,你的视觉焦点要从右到左移动一大段距离. 试着调整下浏 ...

  10. Linux内核访问用户空间文件:get_fs()/set_fs()的使用

    测试环境:Ubuntu 14.04+Kernel 4.4.0-31 关键词:KERNEL_DS.USER_DS.get_fs().set_fs().addr_limit.access_ok. 参考代码 ...