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