• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
雨@哲
博客园    首页    新随笔    联系   管理    订阅  订阅

Java单向链表 学习

在数据结构中,链表是一种重要的数据结构,在程序设计中占有很重要的地位。我们习惯在C语言和C++语言中使用指针来实现链表结构,而由于Java语言不提供指针,所以很多人认为在Java语言中不能实现链表,即使实现也是使用java api Link类。其实,个人觉得Java语言比C和C++更容易实现链表结构。Java语言中的对象引用实际上是一个指针(本文中的指针均为概念上的意义,而非语言提供的数型),所以我们可以编写这样的类来实现链表中的结点。

class Node{

          dataType  data;

          Node next;

}

这样用next来存放下一个类节点。为了说的更清楚,可以创建一个简单的单链表来说明:假设这个链表是用来存数int 型数据的,那么链表的节点类可以如下定义:

// Node.java

public class Node{
   private int data;
   private  Node next;

 public void setData(int data){
  this.data=data;
 }
 public void setNext(Node next){
  this.next=next;
 }
 public int getData(){
  return this.data;
 }
 public Node getNext(){
  return this.next;
 }
}

然后定义一个链表类,来对链表进行各种操作
//Linklist.java

public class Linklist{
 public Node head;

//创建链表
 public void createlink(int [] a){
   Node p;
   Node q=new Node();
   head=q;
   for(int i=0;i<a.length;i++){
   p=new Node();
   p.setData(a[i]);
   q.setNext(p);
   p.setNext(null);
   q=p;
   }
 }

//插入数据
//pos是链表中已存在的数据 ,value将插入到pos的的后面
    public void insertlink(int pos,int value){
  Node ptr;
  Node p;
  ptr=head.getNext();
  while(ptr!=null){
   if(pos==ptr.getData()){
    p=new Node();
    p.setData(value);
    p.setNext(ptr.getNext());
    ptr.setNext(p);
    System.out.println("插入数据"+value+"成功!");
    break;
   }
   else{
    ptr=ptr.getNext();
   }
  }
  if(ptr==null)
   System.out.println("插入数据失败!");
 }
//删除链表中的数据
 public void deletelink(int value){
  Node ptr;
  Node p;
  p=head;
  ptr=head.getNext();
  while(ptr!=null){
   if(value==ptr.getData()){
    p.setNext(ptr.getNext());
    System.gc();
    System.out.println("删除数据"+value+"成功!");
    break;
   }
   else{
    p=ptr;
    ptr=ptr.getNext();
   }
  }
  if(ptr==null)
   System.out.println("链表中没有要删除的数据!");
 }

public void seachlink(int value){
  Node ptr;
  ptr=head.getNext();
  while(ptr!=null){
   if(value==ptr.getData()){
    System.out.println("找到数据:"+ptr.getData());
    break;
   }
   else{
    ptr=ptr.getNext();
   } 
  }
  if(ptr==null)
   System.out.println("链表中没有要查找数据");
 }

//输出链表内容:
 public void printlink(){
  Node ptr;
  ptr=head.getNext();
  while(ptr!=null){
   System.out.print(" "+ptr.getData()+"->");
   ptr=ptr.getNext();
  }
  System.out.println(" NULL");
 }
}

最后再定义一个测试类,测试一下:

//Link.java

public class Link{
 public static void main(String args[]){
   int a[]=new int[10];
   for(int i=0;i<a.length;i++)
    a[i]=i+1;
   Linklist list=new Linklist();
   list.createlink(a);
   System.out.println(" 链表输出如下:");
   list.printlink();

   list.insertlink(15,12);
   System.out.println("插入数据后链表输出如下:");
   list.printlink();

   list.deletelink(10);
   System.out.println("删除数据后链表输出如下:");
   list.printlink();

   list.seachlink(5);
 }
}

可以看到测试成功!!运行结果如下:

posted @ 2012-03-22 09:24  雨@哲  阅读(876)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3