java双向链表结构_【Java数据结构】2.3双向链表的迭代实现
上一章 双向链表的简单实现,本章介绍迭代实现模式使用迭代模式的优点:1,实现功能分离,简化容器接口。让容器只实现本身的基本功能,把迭代功能委让给外部类实现,符合类的设计原则。2,隐藏容器的实现细节。3,为容器或其子容器提供了一个统一接口,一方面方便调用;另一方面使得调用者不必关注迭代器的实现细节。4,可以为容器或其子容器实现不同的迭代方法或多个迭代方法。我觉得第4点说的很好,对于一堆数据而言,不同的人(或业务逻辑)使用它的方式也不尽相同,定义一个theIterator继承Iterator,不仅提供next,hasNext以及remove这个最小的操作集合,同时也可以提供更多的其它方法。在theIterator的实现类中,具体实现不同的迭代方法,比如顺序、逆序或根据其它语义进行遍历等,再通过类厂的方式将一个theIterator实现的对象交给用户使用。
迭代模式实现:package com.ds.link;
import java.util.Iterator;
import java.util.NoSuchElementException;
public class DoubleLinkIt implements Iterable {
/**
* Node类定义了双向链表中节点的结构,它是一个私有类,
* 而其属性和构造函数都是公有的,这样,其父类可以直接访问其属性
* 而外部类根本不知道Node类的存在。
* @author ZHB
*
* @param 类型
* @param Data 是节点中的数据
* @param pre 指向前一个Node节点
* @param next 指向后一个Node节点
*/
private class Node {
public Node pre;
public Node next;
public T data;
public Node(T data, Node pre, Node next) {
this.data = data;
this.pre = pre;
this.next = next;
}
public Node() {
this.data = null;
this.pre = null;
this.next = null;
}
}
// 下面是DoubleLinkedList类的数据成员和方法
private int theSize;
private Node Header;
private Node Tail;
/*
* 构造函数
* 我们构造了一个带有头、尾节点的双向链表
* 头节点的Next指向尾节点
* 为节点的pre指向头节点
* 链表长度起始为0。
*/
public DoubleLinkIt() {
theSize = 0;
Header = new Node(null, null, null);
Tail = new Node(null, Header, null);
Header.next = Tail;
}
public void add(T item) {
Node aNode = new Node(item, null, null);
Tail.pre.next = aNode;
aNode.pre = Tail.pre;
aNode.next = Tail;
Tail.pre = aNode;
theSize++;
}
public boolean isEmpty() {
return (this.theSize == 0);
}
public int size() {
return this.theSize;
}
public T getInt(int index) {
if (index > this.theSize - 1 || index < 0)
throw new IndexOutOfBoundsException();
Node current = Header.next;
for (int i = 0; i < index; i++) {
current = current.next;
}
return current.data;
}
public void print() {
Node current = Header.next;
while (current.next != null) {
System.out.println(current.data.toString());
current = current.next;
}
}
/*
*
* DoubleLinkIt类实现了java.lan.Itrable接口,
* 因此我们必须实现其public Iterator iterator() {}方法,它的返回值是一个迭代器对象,
* 那么我就定义一个内部私有类——MyListIterator,这个类实现了iterator接口。
* 在public Iterator iterator() 方法中,我就构造这么一个MyListIterator的对象并返回。
*Iterator接口有三个方法是我们必须实现的,hasNext,next和remove,
*这是迭代操作的最小集合了。对于不同的迭代器执行方式,
*我们可以定义多个类似MyListIterator这样的实现类,只要在链表类中的iterator() 方法中把具体实现类的对象返回给用户就OK了。
*/
@Override
public Iterator iterator() {
return new myListIterator();
}
public class myListIterator implements Iterator {
Node current = Header.next;
@Override
public boolean hasNext() {
return (current != Tail);
}
@Override
public T next() {
if (!hasNext())
throw new IndexOutOfBoundsException();
T item = current.data;
current = current.next;
return item;
}
@Override
public void remove() {
if (!hasNext())
throw new NoSuchElementException();
current.pre.next = current.next;
current.next.pre = current.pre;
current = current.next;
theSize--;
}
}
//测试代码
public static void main(String[] args) {
DoubleLinkIt itLink = new DoubleLinkIt();
for (int i = 0; i < 10; i++) {
ItemInfo item = new ItemInfo(" " + i, i * i);
itLink.add(item);
}
Iterator it = itLink.iterator();
// while (it.hasNext())
// it.remove();
while (it.hasNext())
System.out.println(it.next().toString());
}
}
其中ItemInfo的定义如下:package com.ds.link;
public class ItemInfo {
private String name;
private int age;
public ItemInfo(String name,int age){
this.name = name;
this.age = age;
}
public ItemInfo(){
this.name = null;
this.age = 0;
}
public String toString(){
StringBuilder sb = new StringBuilder("姓名:");
sb.append(this.name).append("\t").append("年龄:").append(this.age);
return sb.toString();
}
}
运行结果:姓名: 0 年龄:0
姓名: 1 年龄:1
姓名: 2 年龄:4
姓名: 3 年龄:9
姓名: 4 年龄:16
姓名: 5 年龄:25
姓名: 6 年龄:36
姓名: 7 年龄:49
姓名: 8 年龄:64
姓名: 9 年龄:81
如果存在问题,我们随时沟通!
java双向链表结构_【Java数据结构】2.3双向链表的迭代实现相关推荐
- 快速带你分清java内存结构,java内存模型,java对象模型和jvm内存结构!
现如今你是否有这样的感觉,无论生活还是学习,节奏都是非常的快,每天面对海量的知识信息,自己感觉都要hold不住了,每天打开微信公众号,是不是发现有几十条未读,无论是技术文章还是其他类型的文章,我们大多 ...
- 图解数据结构使用java电子书下载_图解数据结构:使用Java 胡昭民著 PDF下载
本书内容架构完整,逻辑清楚,采用丰富的图例来阐述基本概念及应用.强调边做边学,结合下载文件,给予最完整的支援.以Java程序语言实现数据结构中的重要理论,以范例程序说明数据结构的内涵.采用JavaID ...
- java 代码结构_代码结构说明
代码结构说明 === ## 一.JEECG目录结构 ### 1.配置文件目录结构 JEECG中的配置文件目录结构如图3-1所示. ![输入图片说明](https://static.oschina.ne ...
- java三种循环结构的关键字,Java循环结构_常量_关键字
语法格式: int i = 0://初始化值 while(i<10){ //循环判断 循环体 循环重复执行的代码 循环控制语句 } 解析While循环 初始化条件[定义初始变量.只执行一次] ...
- java resources 目录_[Java] 在 jar 文件中读取 resources 目录下的文件
注意两点: 1. 将资源目录添加到 build path,确保该目录下的文件被拷贝到 jar 文件中. 2. jar 内部的东西,可以当作 stream 来读取,但不应该当作 file 来读取. 例子 ...
- java取负数_[Java] 告别“CV 工程师”码出高效!(基础篇)
作为一名资深的 CV 工程师,某天,当我再一次日常看见满屏的报错信息与键盘上已经磨的泛白的 Ctrl.C.V 这三个按键时,我顿悟了. 百度谷歌复制粘贴虽然很香,但是总是依靠前人种树,终会有一天失去乘 ...
- Java内存结构与Java内存模型
Java内存结构.内存模型.对象模型这几个概念经常会被混为一谈.理论知识容易忘写下来帮助记忆,方便以后查看. 1.Java内存结构 Java内存结构其实说的是JVM在运行时内存区域的划分,是根据Jav ...
- JAVA内存结构和JAVA内存模型
JAVA内存结构:堆.栈.方法区: 堆:存放所有 new出来的东西(堆空间是所有线程共享,虚拟机气动的时候建立):栈:存放局部变量(线程创建的时候 被创建):方法区:被虚拟机加载的类信息.常量.静态常 ...
- java星空屏幕_[Java教程]窗口设置_星空网
窗口设置 2016-04-13 0 /** * 这个是GUI的事例程序: * */ package w160412.wang.main;import java.awt.Color; import ja ...
- java控制语句练习题_[Java初探实例篇02]__流程控制语句知识相关的实例练习
本例就流程控制语句的应用方面,通过三个练习题来深入学习和巩固下学习的流程控制语句方面的知识,设计到,if条件判断语句,switch多分支语句,for循环语句及其嵌套多层使用,while循环语句. 练习 ...
最新文章
- 开发Java,市值一度超过两千亿美元,造福无数程序员的Sun公司,也最终“陨落”...
- Dispatcher.Invoke方法
- 5分钟“调教”一只机器狗,百度飞桨已经简单到这地步了吗?
- 原来这才是日志打印的正确姿势!
- 一文读懂 AVL 树
- SQL Server 数据库的整理优化的基本过程(三)
- 【Flink】Flink Invalid timestamp -1 Timestamp should always be none-negative or null
- html改变微信标题栏颜色,带你了解微信在线编辑器的颜色样式修改
- 【编译原理笔记16】代码优化:流图,常用代码优化方法, 基本块的优化
- AcWing 840. 模拟散列表(散列hash)
- Android Studio API 文档_下载与使用
- 史上最详细的Studio教程二来啦
- css cursor 鼠标手势
- [转帖]超能课堂:Intel平台芯片组变迁史
- 计算机键盘最小化,电脑按哪个键可以使窗口最小化
- 读书笔记 之《软件架构设计: 大型网站技术架构与业务架构融合之道》
- Visual Studio设置release版本可调试
- 重写equals()方法
- 国王游戏.2333_微扰(邻项交换)证明
- 东北大学应用数理统计第二章知识点总结——参数估计
热门文章
- [转] Batch Normalization
- Centos7.6安装Oracle11gR2
- tomcat,httpd 日志格式说明
- C# Conditional(方法,属性的忽略)使用
- openwrt源码下载移植
- [转] NOI, NOIP, IOI, ACM
- HDU 5820 Lights(扫描线+zkw线段树)
- CAS(Compare and Swap)理解
- Item 22: 当使用Pimpl机制时,在实现文件中给出特殊成员函数的实现
- Asp.Net 4.0 新特性 系列 之一 从页面标记%%说起