链表迭代器

原创 2012年03月29日 17:03:36

Java数据结构和算法中文第二版.pdf 代码  

Link.java

package com.ch5.interIterator;

public class Link {

	private long dData ;
	private Link next ;
	
	public Link(long key){
		this.dData = key ;
	}

	public long getdData() {
		return dData;
	}

	public void setdData(long dData) {
		this.dData = dData;
	}

	public Link getNext() {
		return next;
	}

	public void setNext(Link next) {
		this.next = next;
	}
	
	public void displayLink(){
		System.out.print(dData + " ") ;
	}
	
}

LinkList.java

package com.ch5.interIterator;

public class LinkList {

	private Link first ;
	
	public LinkList(){
		first = null ;
	}

	public Link getFirst() {
		return first;
	}

	public void setFirst(Link first) {
		this.first = first;
	}
	
	public boolean isEmpty(){
		return (first == null)  ;
	}
	
	public ListIterator getIterator(){
		return new ListIterator(this) ;
	}
	
	public void displayList(){
		Link current = first ;
		while (null != current){
			System.out.println(current.getdData() + " ");
			current = current.getNext() ;
		}
		System.out.println(" ");
		
	}
}


ListIterator.java

package com.ch5.interIterator;

public class ListIterator {

	private Link current ;
	private Link previous ;
	private LinkList ourList ;
	
	public ListIterator(LinkList ourList){
		this.ourList = ourList ;
		reset() ;
	}

	public void reset() {
		current = ourList.getFirst() ;
		previous = null ;
	}
	
	public boolean atEnd(){
		return (current.getNext() == null ) ;
	}
	
	
	public void nextLink(){
		previous = current ;
		current = current.getNext() ;
	}
	
	public Link getCurrent(){
		return this.current ;
	}
	
	public Link getPrevious(){
		return this.previous ;
	}
	
	public void insertAfter(long value){
		Link newLink = new Link(value) ;
		if (ourList.isEmpty()){
			ourList.setFirst(newLink) ;
			current = newLink ;
		}else{
			newLink.setNext(current.getNext()) ;
			current.setNext(newLink) ;
			nextLink() ;//当前节点为新增节点
		}
	}
	
	public  void insertBefor(long value){
		Link newLink = new Link(value) ;
		if (this.previous == null){
			newLink.setNext(ourList.getFirst()) ;
			ourList.setFirst(newLink) ;
			reset() ;
		}else{
			newLink.setNext(previous.getNext()) ;
			previous.setNext(newLink) ;
			current = newLink ;
		}
	}
	
	public long deleteCurrent(){
		if (current == null) {
			return -1 ;
		}
		long value = current.getdData() ;
		
		if (previous == null){
			ourList.setFirst(current.getNext()) ;
			reset() ;
		}else{
			previous.setNext(current.getNext()) ;
			if (atEnd()){
				reset() ;
			}else{
				current = current.getNext() ;
			}
		}
		return value ;
		
	}
	
}


InterIterApp.java

package com.ch5.interIterator;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class InterIterApp {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws IOException {

		LinkList theList = new LinkList();
		ListIterator iter = theList.getIterator();

		long value;
		iter.insertAfter(20);
		iter.insertAfter(40);
		iter.insertAfter(80);
		iter.insertBefor(60);

		while (true) {
			System.out.print("Enter first letter of show, reset, ");
			System.out.print("next, get, before, after, delete:");
			System.out.flush();

			int choice = getChar();
			switch (choice) {
			case 's':
				if (!theList.isEmpty()) {
					theList.displayList();
				} else {
					System.out.println("List is empty!");
				}
				break;
			case 'r':
				iter.reset() ;
				break ;
			case 'n':
				if (!theList.isEmpty() && !iter.atEnd()){
					iter.nextLink() ;
				}else{
					System.out.println("Can't go to next Link !"); 
				}
				break ;
			case 'g':
				if (! theList.isEmpty()){
					value = iter.getCurrent().getdData() ;
					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() ;
				iter.insertBefor(value) ;
				break ;
			case 'a':
				System.out.println("Enter value to insert: ");
				System.out.flush() ;
				value = getInt() ;
				iter.insertAfter(value) ;
				break ;
			case 'd':
				if (!theList.isEmpty()){
					value = iter.deleteCurrent() ;
					System.out.println("Deleted : " + value );
				}else{
					System.out.println("List is empty!");
				}
				break ;
			case 'q':
				System.out.println("Quit , Bye Bye.") ;
				System.exit(0) ;
			default:
				System.out.println("Invaild Entry.") ;
				break ;
			}
		}
	}

	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);
	}
}


运行结果:

 

Enter first letter of show, reset, next, get, before, after, delete:s
20
40
60
80
 
Enter first letter of show, reset, next, get, before, after, delete:a
Enter value to insert:
10
Enter first letter of show, reset, next, get, before, after, delete:s
20
40
60
10
80
 
Enter first letter of show, reset, next, get, before, after, delete:d
Deleted : 10
Enter first letter of show, reset, next, get, before, after, delete:s
20
40
60
80
 
Enter first letter of show, reset, next, get, before, after, delete:

学习STL,实现一个单链表的迭代器

STL源码剖析中,空间配置器和迭代器属于比较晦涩难懂的两章,这里学习了STL迭代器后也尝试自己写一个迭代器,实现单链表的迭代器,实现不难,可以说是一个玩具而已,但是能够帮助我们理解STL迭代器的基本原...
  • z702143700
  • z702143700
  • 2015年09月10日 10:38
  • 772

[C++]List with iterator(链表的迭代器实现)

List with iterator(链表的迭代器实现)我们都知道STL容器内部都有相应的迭代器,本文主要讨论的就是链表内部的迭代器实现。测试代码#include #include using n...
  • stary_yan
  • stary_yan
  • 2016年05月30日 16:21
  • 2835

C语言实现面向对象风格带迭代器的双向链表

首先看main函数中双向链表的用法: #include #include #include "dlist.h" int main(void) { LinkedList* list = ne...
  • jb_peng
  • jb_peng
  • 2016年05月26日 20:24
  • 488

双向链表(迭代器)

//双向链表(迭代器)#include #includeusing namespace std;//链表结点 template struct _ListNode { _ListN...
  • bitboss
  • bitboss
  • 2016年09月21日 19:26
  • 1239

浅谈STL list<T>链表容器和迭代器的使用C++实现

一、今天简单的实现了STL容器里面的顺序容器list双链表里面的简单应用和迭代器的简单实现方法    包括迭代器的重载方法     二、双向链表的实现需要了解 堆得内存分配问题。堆内存是开发者使用ne...
  • whisperfor
  • whisperfor
  • 2017年05月26日 21:46
  • 323

java链表的get方法遍历VS使用迭代器遍历

无论何种集合,应当允许用户以某种方式遍历集合,而不需要知道对象在集合中是如何表示及存储的,java集合框架为各种数据结构的集合,比如链表、散列表等都提供了迭代器。     某些集合根据其数据存储结构...
  • huacuo2013
  • huacuo2013
  • 2015年09月30日 15:05
  • 1014

python迭代器以及生成器

迭代,即重复做一些事很多次,python中通过for循环可以对序列、字典以及其他的对象进行迭代。在其他对象进行迭代时,需要在其他对象中实现__iter__方法。 __iter__方法返回一个迭代器,...
  • zhangjiuchao
  • zhangjiuchao
  • 2016年08月17日 17:01
  • 616

迭代器删除操作写法及解释

1 迭代器是什么? 迭代器是一种典型的设计模式,与集合配套使用,其目的是隐藏集合中的内部成员,并且提供对集合成员的访问能力。其结构如下图所示; 具体协作关系及实现方式,就不在此赘述...
  • sandware
  • sandware
  • 2014年11月08日 18:50
  • 648

STL迭代器的使用、正向、逆向输出双向链表中的所有元素

*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Wo...
  • vcx08
  • vcx08
  • 2016年06月07日 19:10
  • 662

Java中的迭代器Iterator和for-each循环

迭代器(Iterator)的工作就是循环一个序列,依次获得里面的对象,这里不再需要程序去关心序列的底层结构。 迭代器的接口一共就三个方法: public interface Iterator { ...
  • janekeyzheng
  • janekeyzheng
  • 2014年12月02日 15:36
  • 2286
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:链表迭代器
举报原因:
原因补充:

(最多只允许输入30个字)