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);
} }
如有问题,欢迎留言。
JAVA链表中迭代器的实现的更多相关文章
- Java集合中迭代器的常用用法
该例子展示了一个Java集合中迭代器的常用用法public class LinkedListTest { public static void main(String[] args) { List&l ...
- Java List中迭代器遍历
在java中,List接口从Collection接口中继承了 iterator()函数,返回值是一个T类型的迭代器(泛型),T是List中元素的类型 public class TestListAndI ...
- 设计模式学习笔记(十六)迭代器模式及其在Java 容器中的应用
迭代器(Iterator)模式,也叫做游标(Cursor)模式.我们知道,在Java 容器中,为了提高容器遍历的方便性,把遍历逻辑从不同类型的集合类中抽取出来,避免向外部暴露集合容器的内部结构. 一. ...
- JAVA实现具有迭代器的线性表(单链表)
一,迭代器的基本知识: 1,为什么要用迭代器?(迭代:即对每一个元素进行一次“问候”) 比如说,我们定义了一个ADT(抽象数据类型),作为ADT的一种实现,如单链表.而单链表的基本操作中,大部分需要用 ...
- java中迭代器应用
本文将利用分析代码的方式,来学习一个集合类的内部结构,以及遍历集合的迭代模式的源码实现细节. 下面我们先简单讨论一个根接口Collection,然后分析一个抽象类AbstractList和它的对应It ...
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 小学生之Java中迭代器实现的原理
一. 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生.我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator();wh ...
- Java中迭代器Iterator的使用
Java集合类中Map接口下的相关类并没有像Collection接口的相关类一样实现get()方法,因此在要实现遍历输出的场景中没法直接用get()方法来取得对象中的数据,但Java本身提供了另一种遍 ...
- 面试中的Java链表
链表作为常考的面试题,并且本身比较灵活,对指针的应用较多.本文对常见的链表面试题Java实现做了整理. 链表节点定义如下: static class Node { int num; Node next ...
随机推荐
- easyui的datebox控件如何只要年月不要日谢谢知道的说一下
例子2015-01 格式easyui-datebox 加上 data-options="formatter:myformatter,parser:myparser"function ...
- 【BZOJ3529】数表
数表 Description 有一张 n*m 的数表,其第i行第j列(1<=i<=n,1<=j<=m)的数值为能同时整除 i和j的所有自然数之和.给定a,计算数表中不大于a的数 ...
- [ZJOI2005]午餐
嘟嘟嘟 贪心+dp. 首先贪心很容易想到,把吃饭时间长的人排在前面.因为打饭时间的顺序对最终答案没有影响,所以可以以吃饭时间为关键字排序. 然后就是dp了(我当时还自信满满的贪心交了一发--显然WA啊 ...
- PHP的运行机制与原理(底层)
原文:http://www.jb51.net/article/74907.htm 说到php的运行机制还要先给大家介绍php的模块,PHP总共有三个模块:内核.Zend引擎.以及扩展层:PHP内核用来 ...
- 2190: [SDOI2008]仪仗队
Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是 ...
- 接上篇elasticsecrchi 进行搜索及时提示,数据库以及后台代码
-- ------------------------------ Table structure for articles-- ----------------------------DROP TA ...
- shell脚本之获取CPU使用率
今天一个同事要测试OJ项目,同时我这边也需要知道他在压测过程中, CPU的使用率怎么样,虽说可以用top实时查看,但是进程太多了,我不需要获取那么多信息,我仅仅只要知道当前压测过程中CPU实时的使用率 ...
- 市场不相信眼泪:AI第一股暴力裁员 惨了
近日,有网友在社交平台匿名爆料称,科大讯飞准备优化30%的正式员工. 还有人匿名爆料,科大讯飞无补助报销出差加班,迫使员工离职,并将矛头指向了一个叫“黄狗子”“黄国庆”的角色. 有媒体猜测,科大讯飞采 ...
- 20175310 迭代和JDB
迭代和JDB 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功能 zuheshu.java文件夹下的代码: import java.util.S ...
- Linux C++调试利器-gdb
在Linux上开发后台C++程序时,没有类似Windows VisualStudio那样强大的可视化IDE.为了提高调试效率,快速定位问题,需要掌握gdb工具的一些基本用法. 添加调试符号信息 co ...