数据结构再回顾(一)------------链表

Java中可以包含指向自身的引用,通过对自身的引用可以实现一个链表的存储

链表包含链表的节点类,链表的实现类,自定义空链表异常(此处只是简单的调用super(name)方法)

节点类的实现

包含两个属性,

一个用于存储单前当前节点的数据对象信息  Object data

另一个用于存储指向下一个节点的引用,ListNode next

两个构造方法,ListNode(Object o)用来初始化节点 

ListNode(Object o,ListNode nextNode)用来确定下一个引用

链表实现类MyList

 private ListNode firstNode   第一个节点的引用

 private ListNode lastNode  最后一个节点的引用

 private String name             链表对象名

在链表头部插入一个对象  insertAtFront(Object insertItem)

如果链表为空  首节点和尾节点都指向刚插入的节点

否则将首节点指向刚插入的节点,并将该节点的next对象指向原来的首节点

在尾部插入节点insertAtBack(Object insertItem)

如果链表为空  首节点和尾节点都指向刚插入的节点

将当前的尾节点对下一个节点的引用指向新加入的节点

将尾节点指向新加入的节点


从头部删除节点removeFromFront()

判断链表是否为空,是的话抛出空链表异常

如果只有一个节点,则将首节点和尾节点都置为空 ,否则就将首节点后移


从尾部删除节点removeFromBack()

判断链表是否为空,是的话抛出空链表异常

如果只有一个节点,则将首节点和尾节点都置为空 ,

否则循环查找,直到找到某个节点对下一个节点的引用为尾节点时,则该节点的上一个节点被置为新的尾节点,其引用置为空

源代码如下:

/**
 * @(#)ListTest.java
 * Have classes:ListTest, 
 * Copyright 2005 Fane. All rights reserved.
 * @author      Fane
 * @version     1.0, 26/04/05
 * @since       1.0
 */
package person.fane.test;

/**
 *
 * @author Fane
 *
 * TODO
 *     2005-08-01
 *     链表的节点类 包含当前节点和指向下一个节点的引用
 *
 */
class ListNode
{
 /*
  * 当前节点
  */
 Object data;
 /*
  * 下一个节点的引用
  */
 ListNode next;
 
 /**
  * 构造方法
  * @param o
  */
 ListNode(Object o)
 {
  this.data = o;
  this.next = null;
 }
 
 /**
  * 构造方法
  * @param o
  * @param nextNode
  */
 ListNode(Object o,ListNode nextNode)
 {
  this.data = o;
  this.next = nextNode;
 }
 
 /**
  * 得到当前的节点的对象
  * @return data
  */
 Object getObject()
 {
  return this.data;
 }
 
 /**
  * 得到当前节点指向下一个节点的引用
  * @return next
  */
 ListNode getNext()
 {
  return this.next;
 }
}

/**
 * 链表实现类
 * @author Fane
 *
 * TODO
 *     2005-08-01
 *     添加insertAtFront,insertAtBack,removeFromFront,removeFromBack方法
 */
class MyList
{
 /*
  * 第一个节点
  */
 private ListNode firstNode;
 /*
  * 最后一个节点
  */
 private ListNode lastNode;
 /*
  * 链表的名字
  */
 private String name;
 
 /**
  * 初始化链表
  * @param s
  */
 public MyList(String s)
 {
  this.name = s;
  this.lastNode = null;
  this.firstNode = null;
 }
 
 public MyList()
 {
  this("mylist");
 }
 
 /**
  * 在链表前面插入元素
  * @param insertItem
  */
 public void insertAtFront(Object insertItem)
 {
  if(isEmpty())
  {
   this.firstNode = this.lastNode = new ListNode(insertItem);
   
  }else
  {
   this.firstNode = new ListNode(insertItem,this.firstNode);
  }
   
 }
 
 /**
  * 在链表后面插入元素
  * @param insertItem
  */
 public void insertAtBack(Object insertItem)
 {
  if(isEmpty())
  {
   this.firstNode = this.lastNode = new ListNode(insertItem);
   
  
  }else
  {
   this.lastNode.next = new ListNode(insertItem);
   
   this.lastNode = this.lastNode.next;
  }
 }
 
 /**
  * 从链表头部删除元素
  * @return
  * @throws EmptyMyListException
  */
 public Object removeFromFront()throws EmptyMyListException
 {
  Object removeItem = null;
  
  if(isEmpty())
   throw new EmptyMyListException(this.name);
   
  removeItem = this.firstNode.data;
  
  if(this.firstNode.equals(this.lastNode))
  {
   this.lastNode =null;
   this.firstNode = null;
  }else
  {
   this.firstNode = this.firstNode.next;
  }
   
  return removeItem;
 }
 
 /**
  * 从链表尾部删除元素
  * @return
  * @throws EmptyMyListException
  */
 public Object removeFromBack()throws EmptyMyListException
 {
  
  Object removeItem = null;
  
  if(isEmpty())
   throw new EmptyMyListException(this.name);
   
  removeItem = this.lastNode.data;
  
  if(this.firstNode.equals(this.lastNode))
  {
   this.lastNode = null;
   this.firstNode = null;
  }else
  {
   ListNode current = this.firstNode;
   
   while(current.next != this.lastNode)
    current =current.next;
   
   this.lastNode = current;
   current.next = null;
  }
  
  return removeItem;
 }
 
 /**
  * 判断链表是否为空
  * @return
  */
 public boolean isEmpty()
 {
  return this.firstNode == null;
 }
 
 /**
  * 输出链表的各个元素
  *
  */
 public void print()
 {
  if(isEmpty())
  {
   System.out.println("Empty "+this.name);
   return;
  }
  
  System.out.print("The "+this.name+ " is: ");
  
  ListNode current = this.firstNode;
  
  while(current != null)
  {
   System.out.print(current.data.toString()+" ");
   current = current.next;
  }
  
  System.out.println();
  System.out.println();
  
 }
}

/**
 *
 * @author Fane
 *
 * TODO
 *     2005-08-01
 *     空链表异常      
 */
class EmptyMyListException extends RuntimeException
{
 /**
  * <code>serialVersionUID</code> 的注释
  */
 private static final long serialVersionUID = 1L;

 public EmptyMyListException(String name)
 {
  super("The "+name+ " is empty");
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值