as3.0实现的单向链表

//节点类

 

package publicOrg.vily.data.list{

 //publicOrg.vily.data.list.Node
 class Node{
  /** 
  * 链表结构的特征: 
  * 分二部分:
  * 第一部分为数据
  * 第二部分为地址,它指下一个节点
  */
  public var data:int = 0;
  public var next:Node = null;

  public function Node(data:int){
   this.data = data;
  }
 }
}

 

//链表类

 

package publicOrg.vily.data.list{
 //publicOrg.vily.data.list.SingleLinkTable
 
 import publicOrg.vily.data.list.Node;
 public class SingleLinkTable{
  /** -------------------------------------------------------
   本类用于实现单向链表的相关属性与行为
  ----------------------------------------------------------- */
  private var head:Node = null;
  public function SingleLinkTable(){
   
  }
  
  /** 
  * 在链表的最前面插入一个值
  * @param data 要插的数据
  * @return 是否成功
  */  
  public function insertFirst(data:int):Boolean{
   var node:Node= new Node(data);
   if(isEmpty()) {
    head = node;
    return true;
   }
   //将新插入的数的地址指向原来的第一位数
   node.next = head;
   //更新插入值后的新链表的头  
   head = node;
   node = null;
   return true;
  }
      
  /** 
  * 在链表的最末插入一个值 
  * @param data 要插入的数据 
  * @return 是否成功 
  */  
  public function insertLast(data:int):Boolean{
   var node:Node = new Node(data);
   if(isEmpty()) {
    //node = head;
    head = node;
    return true;
   }
   var p:Node = head;
   var pre:Node = head;
   //遍历整个链表,从而最终得到一个最后的节点  
   while(!isEnd(p)) {
    // 在向后移动之前得到一个节点  
    pre = p;
    // 逐次向后移动  
    p = p.next;
   }
   // 将要插入的值插入到最后一个节点上  
   pre.next = node;
   node = null;
   return false;
  }
      
  /** 
  * 在某节点前插入一新数据 
  * @param oldData 原节点 
  * @param newData 新节点 
  * @return 是否插入成功 
  */  
  public function insertBefore(oldData:int,newData:int):Boolean{
   var preNode:Node = find(oldData,true);
   
   if(preNode==null) {
    return false;
   }
   var newNode:Node = new Node(newData);
   if(preNode==head) {
    newNode.next=head;
    head = newNode;
   }else {
    var pNode:Node = preNode.next;
    newNode.next=pNode;
    preNode.next=newNode;
   }
   preNode = null;
   return true;
  }
  /** 
  * 在某节点后插入一新数据 
  * @param oldData 原节点 
  * @param newData 新节点 
  * @return 是否插入成功 
  */  
  public function insertAfter(oldData:int,newData:int):Boolean{
   var preNode:Node = find(oldData,false);
   
   if(preNode==null) {
    return false;
   }
   //if(preNode==head) {
    
    trace(" insert ");
    var newNode:Node = new Node(newData);
    var pNode:Node = preNode.next;
    newNode.next = pNode;
    preNode.next = newNode;//pNode;
    newNode = null;
   //}
   preNode = null;
   return true;
  }
  /** 
  * 删除某一节点 
  * @param data 节点数据 
  * @return 是否删除成功 
  */  
  public function remove(data:int):Boolean{
  
   if(isEmpty()) {
    return false;
   }
   var preNode:Node = find(data, true);
   if(preNode == head) {
    head = head.next;
   }else {
    var pNode:Node = preNode.next;
    preNode.next=pNode.next;
   }
   preNode = null;
   return true;
  }

  /** 
  * 将某节点数据更新为新的数据 
  * @param oldData 
  * @param newData 
  * @return 
  */  
  public function update(oldData:int,newData:int):Boolean{
   var pNode:Node = find(oldData, false);
   if(pNode!=null) {
    pNode.data = newData;
    return true;
   }
   return false;
  }
      
  /** 
  * 查找数值为data的节点 
  * @param flag 为false时表示返回要找数据的节点, 
  *             为true时表示返回要找数据之前的节点 
  * @param data 要查找的数值 
  * @return  
  */  
  public function find(data:int,flag:Boolean):Node{
   trace(data+"  ---  "+flag);
   var p:Node = head;
   var pre:Node = head;
   while(!isEnd(p) && p.data != data) {

    // 保存之前的信息  
    pre = p;
    //逐次向后移动  
    p = p.next;
   }
   if(isEnd(p)) {
    return null;  
   }
   if(flag) return pre;
   else return p;
  }
      
  /** 
  * 链表是否为空 
  * @return 
  */  
  public function isEmpty():Boolean{
   return head==null;
  }

  /** 
  * 此节点是否是最后一个节点 
  * @param node 要判断的节点 
  * @return 是否是最后一个节点 
  */
  public function isEnd(node:Node):Boolean{
   return node==null;
  }

  /**
  * 显示链表所有节点信息
  *
  */
  public function toString():void{
   var pNode:Node = head;
   while(pNode!=null) {
    trace(" - - "+pNode.data);
    pNode = pNode.next;
   }
   pNode = null;
  }  
 }
}

posted @ 2008-11-26 10:59  vily_雷  阅读(900)  评论(1编辑  收藏  举报