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
////////////////////////////////////////////////////////////////

 

程序运行结果:

 

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:

 

来源:http://www.java3z.com/cwbwebhome/article/article5/5214.html?id=684
原创粉丝点击