`

java学习笔记:内部类实现单链表

    博客分类:
  • java
阅读更多



 



 

/*
第一个节点称为:头节点,或根节点

[示例]:内部类实现单链表
*/

class Link
{
  private Node head;           //定义头节点,是链表的一个成员变量,是Node类的对象
  public void add(String name) //添加链表中的元素(节点)
  {
    Node newNode= new Node(name);
    if(this.head==null)       //如果没有头节点就把头节点作为头节点
    {
      this.head=newNode;
    }
    else
    {
      //从根节点开始判断插不插,头节点后面如果没有节点就插在头结点后面,
      //有的话就再判断下一个节点后面有木有... 目的是插在最后面
      this.head.addNode(newNode);  //addNode是内部类的方法
    }
  }
  
  public boolean search(String name) //查找节点
  {
    if(head!=null)           //首先检测头节点
    {
        return this.head.searchNode(name); //searchNode是内部类的方法
    }
    else
    {
      return false;
    }
    
  }
  
  public void delete(String name) //删除链表中的元素
  {
    if(this.search(name))  //先看看这个链表中有没有这个节点的名字
    {
        //这个this是链表本身,不是指节点,而head只是链表的一个成员变量
        //而对于Node类来说,head是它的实例对象
        if(this.head.name.equals(name))  //如果发现要删除的是头节点
        {
          if(this.head.nextNode!=null)
          {
            this.head=this.head.nextNode;  //将头节点的下一个节点变成根节点
          }
          else
          {
            this.head=null;  //如果只有一个头节点,删除之后就木有节点了
          }
        }
        else  //如果要删除的不是头节点,就看看是不是要删除头节点的下一个节点
        {
          if(this.head.nextNode!=null)
          {
            this.head.nextNode.deleteNode(head,name); //deleteNode是内部类的方法
          }
        }
    }
  }
  
  public void print() //打印
  {
    if(this.head!=null)
    {
      this.head.printNode();
    }
  }
  
  //-----------    内部类  -----------------//    
  class Node //使用内部类的话,每一个节点就是一个Node对象
  {
      private String name;          //保存节点名称
      private Node nextNode;        //保存下一个节点
      public Node(String name)      //构造
      {
        this.name=name;
      }
      
      public void setNextNode(Node nextNode) //设置下一个节点
      {
        this.nextNode=nextNode;
      }
      
      public Node getNextNode()     //获取下一个节点
      {
        return this.nextNode;
      }
      
      public String getName()       //获取节点名称,我们的节点简单,就只有名称
      {
        return this.name;
      }
      
      public void addNode(Node newNode) //添加节点
      {
        if(this.nextNode==null)//如果不存在下一个节点,就将新节点插到它的后面
        {
          this.nextNode=newNode; //加在最后一个位置
        }
        else
        {
          this.nextNode.addNode(newNode);     //否则就让下一个节点判断插不插,嵌套调用
        }
      }
      
      public boolean searchNode(String name)  //通过名称查找节点
      {
        if(this.name.equals(name))            //比较当前节点是否符合
        {
          return true;
        }
        else
        {
          if(nextNode!=null)                     //下一个节点不为空就继续比较
          {
            return this.nextNode.searchNode(name);//否则就继续查找,递归查找下一个节点
          }
          else
          {
            return false;
          }
        }
      
      }
      
      public void deleteNode(Node preNode,String name)  //删除节点
      {
        if(this.name.equals(name))       //如果当前节点名称就是所要要删除的
        {
          preNode.nextNode=this.nextNode;//将this的下一个节点引用传给this的上一个节点保存
        }
        else
        {
          this.nextNode.deleteNode(this,name);//递归下个节点确认其名称是否就是要删除的
        }
      }
          
      public void printNode()  //打印节点
      {
        s.tp(this.name+"->");
        if(this.nextNode!=null)
        {
          this.nextNode.printNode();
        }     
      }
  }
}

class Demo
{
    public static void main(String[] args) throws Exception
    {
      Link l= new Link();
      l.add("火车头");
      l.add("1号车厢");
      l.add("2号车厢");
      l.add("3号车厢");
      l.add("4号车厢");
      l.add("5号车厢");  
      l.print();
      s.op();
      s.op("删除后-----------------------------------------------");
      l.delete("5号车厢");
      l.print();
    }
}

class s  //万能打印
{
  public static void op(Object obj)
  {
    System.out.println(obj); //打印并换行
  }
  
  public static void op()
  {
    System.out.println();    //打印空行
  }
  
  public static void tp(Object obj)
  {
    System.out.print(obj);   //打印不换行
  }
}

 

  • 大小: 125.8 KB
  • 大小: 67.3 KB
0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics