使用JAVA代码来模拟线性链表的相关操作(增加,删除,插入及查找等)

 

package test.linetable;

public class SingleLinkTableDemo {
 private SingleNode firstNode;
 private SingleNode lastNode;
 private int size;
 
 /**
  * 获取第n个节点
  * @param index
  * @return
  * @throws Exception
  */
    public SingleNode getNode(int index) throws Exception{
     
     if(index >= size) throw new Exception(" out of range!");
     
     SingleNode node = null;
     SingleNode tmpNode = firstNode; 
      
     for(int i = 0;i < size;i++){
      if(i == index) {
       node = tmpNode;
       break;
      }
      tmpNode = tmpNode.getNext();
     }
     
     return node;
    }
   
    /**
     * 增加新节点
     * @param newValue
     */
    public void addNode(String newValue){
     SingleNode newNode = new SingleNode(newValue);
     
     if(firstNode == null) {
      firstNode = newNode;
      lastNode = newNode;
     }else{
      //设置当前最后一个节点的下一个节点为新增节点
      lastNode.setNext(newNode);
      //将最后一个节点指针指向新增节点
      lastNode = newNode;
     }
     size++;
    }
   
    /**
     * 在当前节点后插入一个新节点
     * @param currNode
     * @param newNode
     */
    public void insertNode(SingleNode currNode,SingleNode newNode){
     newNode.setNext(currNode.getNext());
     currNode.setNext(newNode);
     size++;
    }
   
    /**
     * 删除第n个节点,所谓线性表的链式存储删除插入的时间复杂度为O(1),

     * 是要先知道当前节点的情况,如果不知道,还是要进行遍历线性表的,因此实际应用中,时间复杂度还是O(n),所以性能一定不如线性表的顺序存储!
     * @param i
     * @throws Exception
     */
    public void deleteNode(int currIndex) throws Exception{
       if(currIndex < 0 || currIndex > (size - 1) ) throw new Exception("out of range!");
     
       int j = currIndex - 1 < 0 ? 0: currIndex - 1;
       SingleNode tmpNode = firstNode;
       if(currIndex == 0) {
        firstNode = firstNode.getNext();
       }else{
        for(int i = 0;i < size;i++){
         if(i == j) {
         SingleNode nextNode = tmpNode.getNext().getNext();
         tmpNode.setNext(nextNode);
         if(currIndex == (size -1)) lastNode = tmpNode;
         break;
         }
        
         tmpNode = tmpNode.getNext();
        }
       }
       if(size > 0) size--;
    }
   
    public SingleNode getFirstNode() {
  return firstNode;
 }
 
 public SingleNode getLastNode() {
  return lastNode;
 }

 public int  getSize(){
     return size;
    }
 
 public static void main(String[] args){
  SingleLinkTableDemo sd = new SingleLinkTableDemo();
  sd.addNode("0");
  sd.addNode("1");
  sd.addNode("2");
  sd.addNode("3");
  sd.addNode("4");
  
  sd.printList(sd);
  System.out.println("-----------------------------------");
  try {
   SingleNode indexNode = sd.getNode(2);
   SingleNode newNode = new SingleNode("900");
   sd.insertNode(indexNode, newNode);
   
   sd.printList(sd);
   System.out.println("-----------------------------------");
   sd.deleteNode(sd.getSize() -1);
   System.out.println("first Node = " + sd.getFirstNode().getValue());
   sd.printList(sd);
   System.out.println("last Node = " + sd.getLastNode().getValue());
  } catch (Exception e) {
   e.printStackTrace();
  }
  
  System.exit(0);
  
 }
 
 /**
  * 遍历当前线性表
  * @param sd
  */
 public void printList(SingleLinkTableDemo sd){
  for(int i = 0;i < sd.getSize();i++){
   SingleNode tmpNode;
   try {
    tmpNode = sd.getNode(i);
    System.out.println("node" + i + " =" + tmpNode.getValue());
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }
}

class SingleNode {
    public String value;
    public SingleNode next;
   
    public SingleNode(String value){
     this.value = value;
    }
   
 public String getValue() {
  return value;
 }
 
 public void setValue(String value) {
  this.value = value;
 }
 
 public SingleNode getNext() {
  return next;
 }
 
 public void setNext(SingleNode next) {
  this.next = next;
 }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值