JAVA 实现线性表之链表
今天用一天的时间才敲完一个链表,还有很多漏洞,先贴出来供大家参考。
定义接口:
package com.guobing.link;
public interface LinkI {
public void Insert(Object T);
public void Insert(Object T, int i) throws Exception;
public void DeleteAll();
public boolean IsEmpty();
public boolean IsEnd();
}
实现接口:
package com.guobing.linkImpl;
import com.guobing.link.LinkI;
public class LinkList implements LinkI{
/**
* 对一个单链表本身来说,应该有这么几个信息
* 头结点、头指针、尾指针 头指针指向头结点
* 如果线性表为空表, 则头结点的指针域为空
* 所以应该在LinkList中定义这几个变量
*/
private Node head=null;//首结点
private Node tail=null;//尾结点
//private Node HeadPointer=null;//头指针 带头结点的链表才有头指针
private int size;
@Override
public void DeleteAll() {
head = null;
tail = null;
}
/**
* 初始化 创建头指针
*/
public void init(Object T) {
Node node = new Node(T);
head = node;
if(tail == null)
tail = head;
size++;
}
/**
* 在指定的位置插入元素 这里有些问题, 不能在首指针处添加 后面有专门的方法实现
* 当然可以改,但我随便一下》》》
*/
@Override
public void Insert(Object T, int i) throws Exception {
if(i<0||i>size+1) {//+1是为了可以在尾指针处添加
throw new Exception("你输入的数字不合法,请检查");
}
if(i>size){
InsertAtTail(T);//尾指针处插入
} else {
Node node = new Node(T);//创建要插入结点的信息
Node p = head;
int j = 1;
while(p.next != null && j<i-1) {
p = p.next;
j++;
}
node.next = p.next;
p.next = node;
}
size ++;
}
/**
* 在首节点处插入 效率很高
* @param T
*/
public void InsertAtHead(Object T) {
Node p = new Node(T);
p.next = head;
head = p;
}
/**
* 在尾结点插入数据 效率很高
* @param T
*/
public void InsertAtTail(Object T) {
if(!IsEmpty()) {
tail.next = new Node(T);
tail = tail.next;
size ++;
}
}
/**
* 删除首结点 效率很高
*/
public void DeleteAtHead() {
if(!IsEmpty()) {
head = head.next;
}
}
/**
* 删除尾结点 效率很低
*/
public void DeleteAtTail() {
if(!IsEmpty()) {
Node p = head;
while(p.next != null) {
p = p.next;
}
tail = p;
tail.next = null;
}
}
@Override
public boolean IsEmpty() {
return (this.head == null);
}
@Override
public boolean IsEnd() {
// TODO Auto-generated method stub
return (this.tail == null);
}
@Override
public void Insert(Object T) {//这个方法忽略
// TODO Auto-generated method stub
}
/**
* 得到指定位置元素的值
* @param i
*/
public void getElem(int i) {
Node p = head;
int j = 0;
while(p.next != null && j<i) {
p = p.next;
j ++;
}
System.out.println("Elem[" + i + "]" + "的值是:" + p.date);
}
/**
* 打印出链表中的数据
*/
public void print() {
Node current = head;
while(current !=null) {
System.out.print(current.date + " ");
current = current.next;
}
}
public static void main(String [] args) throws Exception {
LinkList list = new LinkList();
list.init("a");
list.InsertAtTail("b");
list.InsertAtTail("c");
list.InsertAtTail("d");
list.InsertAtTail("e");
list.Insert("aaa", 3);
System.out.println(list.size);
list.print();
list.getElem(0);
list.getElem(3);
}
}