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);
}
}
可以看到测试成功!!运行结果如下: