java数据结构:链表与迭代器入门程序
来源:互联网 发布:android布局优化 编辑:程序博客网 时间:2024/04/29 18:46
链表与迭代器入门实例
// interIterator.java
// demonstrates iterators on a linked listListIterator
// to run this program: C>java InterIterApp
import java.io.*; // for I/O
//节点类
class Link
{
public long dData; // 节点中的数据
public Link next; // 在链表中的下一个节点
public Link(long dd) // 节点类的构造函数
{ dData = dd; }
public void displayLink(){ // 显示节点
System.out.print(dData + " ");
}
}
//链表类
class LinkList
{
private Link first; // 链表中的头节点
public LinkList() // 构造方法
{ first = null; } // 链表中还没有数据
public Link getFirst() // 获取第一个节点
{ return first; }
public void setFirst(Link f) // 把头节点设置到一个新的节点
{ first = f; }
public boolean isEmpty() // 如果链表是空,则返回true
{ return first==null; }
public ListIterator getIterator() // 获取这个链表的迭代器
{
return new ListIterator(this); // 用这个链表初始化迭代器
}
public void displayList() //显示链表中的所有数据
{
Link current = first; // 指向链表的头节点
while(current != null) // 循环到链表的最后一个节点
{
current.displayLink(); // 输出数据
current = current.next; // 指向下一个节点
}
System.out.println("");
}
} // end class LinkList
//迭代器类
class ListIterator
{
private Link current; // 迭代器的当前节点
private Link previous; // 迭代器的前一个节点
private LinkList ourList; // 要迭代的链表
public ListIterator(LinkList list) // 迭代器的构造方法
{
ourList = list;
reset();
}
public void reset() // 迭代器的当前节点指向链表的头节点
{
current = ourList.getFirst();
previous = null;
}
public boolean atEnd() // 如果迭代器的当前节点的下一个节点为null,表示到达链表末
{ return (current.next==null); }
public void nextLink() // 将迭代器的当前节点指向自己的下一个节点
{
previous = current;
current = current.next;
}
public Link getCurrent() // 获取迭代器的当前节点
{ return current; }
public void insertAfter(long dd) // 在迭代器的当前节点后面插入节点
{
Link newLink = new Link(dd); //要插入的新节点
if( ourList.isEmpty() ) // 如果链表为空
{
ourList.setFirst(newLink);//将新节点设为链表的头节点
current = newLink; //迭代器的当前节点指向链表的头节点
}
else // 链表非空
{ //新节点的下一个节点指向迭代器当前节点的下一个节点
newLink.next = current.next;
current.next = newLink; //迭代器当前节点的下一个节点指向新节点
nextLink(); // 迭代器的当前节点指向新节点
}
}
public void insertBefore(long dd) // 在迭代器的当前节点前面插入节点
{
Link newLink = new Link(dd);
if(previous == null) // beginning of list
{ // (or empty list)
newLink.next = ourList.getFirst();
ourList.setFirst(newLink);
reset();
}
else // not beginning
{
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;
}
} // end class ListIterator
//测试类
class InterIterApp
{
public static void main(String[] args) throws IOException
{
LinkList theList = new LinkList(); // new list
ListIterator iter1 = theList.getIterator(); // new iter
long value;
iter1.insertAfter(20); // insert items
iter1.insertAfter(40);
iter1.insertAfter(80);
iter1.insertBefore(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(); // get user's option
switch(choice)
{
case 's': // 显示链表中的数据
if( !theList.isEmpty() )
theList.displayList();
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 next link");
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.print("Enter value to insert: ");
System.out.flush();
value = getInt();
iter1.insertBefore(value);
break;
case 'a': // 在迭代器当前节点后插入节点
System.out.print("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");
} // end switch
} // end while
} // end main()
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);
}
} // end class InterIterApp
////////////////////////////////////////////////////////////////
// demonstrates iterators on a linked listListIterator
// to run this program: C>java InterIterApp
import java.io.*; // for I/O
//节点类
class Link
{
public long dData; // 节点中的数据
public Link next; // 在链表中的下一个节点
public Link(long dd) // 节点类的构造函数
{ dData = dd; }
public void displayLink(){ // 显示节点
System.out.print(dData + " ");
}
}
//链表类
class LinkList
{
private Link first; // 链表中的头节点
public LinkList() // 构造方法
{ first = null; } // 链表中还没有数据
public Link getFirst() // 获取第一个节点
{ return first; }
public void setFirst(Link f) // 把头节点设置到一个新的节点
{ first = f; }
public boolean isEmpty() // 如果链表是空,则返回true
{ return first==null; }
public ListIterator getIterator() // 获取这个链表的迭代器
{
return new ListIterator(this); // 用这个链表初始化迭代器
}
public void displayList() //显示链表中的所有数据
{
Link current = first; // 指向链表的头节点
while(current != null) // 循环到链表的最后一个节点
{
current.displayLink(); // 输出数据
current = current.next; // 指向下一个节点
}
System.out.println("");
}
} // end class LinkList
//迭代器类
class ListIterator
{
private Link current; // 迭代器的当前节点
private Link previous; // 迭代器的前一个节点
private LinkList ourList; // 要迭代的链表
public ListIterator(LinkList list) // 迭代器的构造方法
{
ourList = list;
reset();
}
public void reset() // 迭代器的当前节点指向链表的头节点
{
current = ourList.getFirst();
previous = null;
}
public boolean atEnd() // 如果迭代器的当前节点的下一个节点为null,表示到达链表末
{ return (current.next==null); }
public void nextLink() // 将迭代器的当前节点指向自己的下一个节点
{
previous = current;
current = current.next;
}
public Link getCurrent() // 获取迭代器的当前节点
{ return current; }
public void insertAfter(long dd) // 在迭代器的当前节点后面插入节点
{
Link newLink = new Link(dd); //要插入的新节点
if( ourList.isEmpty() ) // 如果链表为空
{
ourList.setFirst(newLink);//将新节点设为链表的头节点
current = newLink; //迭代器的当前节点指向链表的头节点
}
else // 链表非空
{ //新节点的下一个节点指向迭代器当前节点的下一个节点
newLink.next = current.next;
current.next = newLink; //迭代器当前节点的下一个节点指向新节点
nextLink(); // 迭代器的当前节点指向新节点
}
}
public void insertBefore(long dd) // 在迭代器的当前节点前面插入节点
{
Link newLink = new Link(dd);
if(previous == null) // beginning of list
{ // (or empty list)
newLink.next = ourList.getFirst();
ourList.setFirst(newLink);
reset();
}
else // not beginning
{
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;
}
} // end class ListIterator
//测试类
class InterIterApp
{
public static void main(String[] args) throws IOException
{
LinkList theList = new LinkList(); // new list
ListIterator iter1 = theList.getIterator(); // new iter
long value;
iter1.insertAfter(20); // insert items
iter1.insertAfter(40);
iter1.insertAfter(80);
iter1.insertBefore(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(); // get user's option
switch(choice)
{
case 's': // 显示链表中的数据
if( !theList.isEmpty() )
theList.displayList();
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 next link");
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.print("Enter value to insert: ");
System.out.flush();
value = getInt();
iter1.insertBefore(value);
break;
case 'a': // 在迭代器当前节点后插入节点
System.out.print("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");
} // end switch
} // end while
} // end main()
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);
}
} // end class InterIterApp
////////////////////////////////////////////////////////////////
程序运行结果:
C:java>java InterIterApp
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: n
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: n
Can't go to next link
Enter first letter of show, reset, next, get, before, after, delete: g
Returned 80
Enter first letter of show, reset, next, get, before, after, delete: n
Can't go to next link
Enter first letter of show, reset, next, get, before, after, delete: r
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: n
Enter first letter of show, reset, next, get, before, after, delete: g
Returned 40
Enter first letter of show, reset, next, get, before, after, delete: n
Enter first letter of show, reset, next, get, before, after, delete: g
Returned 60
Enter first letter of show, reset, next, get, before, after, delete: n
Enter first letter of show, reset, next, get, before, after, delete: g
Returned 80
Enter first letter of show, reset, next, get, before, after, delete: b
Enter value to insert: 90
Enter first letter of show, reset, next, get, before, after, delete: s
20 40 60 90 80
Enter first letter of show, reset, next, get, before, after, delete: d
Deleted 90
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: s
20 40 60 80
Enter first letter of show, reset, next, get, before, after, delete:
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: n
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: n
Can't go to next link
Enter first letter of show, reset, next, get, before, after, delete: g
Returned 80
Enter first letter of show, reset, next, get, before, after, delete: n
Can't go to next link
Enter first letter of show, reset, next, get, before, after, delete: r
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: n
Enter first letter of show, reset, next, get, before, after, delete: g
Returned 40
Enter first letter of show, reset, next, get, before, after, delete: n
Enter first letter of show, reset, next, get, before, after, delete: g
Returned 60
Enter first letter of show, reset, next, get, before, after, delete: n
Enter first letter of show, reset, next, get, before, after, delete: g
Returned 80
Enter first letter of show, reset, next, get, before, after, delete: b
Enter value to insert: 90
Enter first letter of show, reset, next, get, before, after, delete: s
20 40 60 90 80
Enter first letter of show, reset, next, get, before, after, delete: d
Deleted 90
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: s
20 40 60 80
Enter first letter of show, reset, next, get, before, after, delete:
来源:http://www.java3z.com/cwbwebhome/article/article5/5214.html?id=684
- java数据结构:链表与迭代器入门程序
- java 数据结构 遍历链表程序
- 【数据结构与算法】java链表操作
- java数据结构与算法-有序链表
- java数据结构与算法-双向链表
- 数据结构与算法入门
- 数据结构与算法入门
- Java基础数据结构——链表与顺序表
- Java 数据结构与算法之链表实现
- Java数据结构与算法---链表的实现
- 数据结构与算法Java版——双向链表
- 【数据结构与算法】数据结构+算法=程序
- JAVA数据结构---二叉树入门
- Apache Thrift入门(安装、测试与java程序编写)
- 数据结构入门学习系列-6(链表合并与多项式合并算法)
- java数据结构链表
- Java版常见数据结构与算法1 -- 数据结构 --线性表
- 数据结构与算法程序集
- Tomcat同时发布多个应用的配置
- 基于MySQL的数据库集群系统的实现
- tij学习笔记(static,final关键字的一些问题和比较)
- MYSQL的数据同步试验
- SCO UNIX快速入门
- java数据结构:链表与迭代器入门程序
- 共享锁与排他锁
- 日本某汽车公司开发项目
- blog开张
- 参数检查
- 落户CSDN勒。。
- 如何使用jacob将word转换为PDF
- Solaris网络课程认证 and 上海租房记
- 【自嘲】可怜的程序员