总共分为3个文件:
Node.java ---声明节点里的内容
NodeList.java --声明链表类
NodeListTest.java --测试主函数
//###############链表类中的节点类######################
//文件名: Node.java
//内容为姓名和号码
//2011年8月11日
//write by chenjun
public class Node{
public String name;
public String number;
}
//###############链表类######################
//文件名: NodeList.java
//节点内容为姓名和号码
//2011年8月11日
//write by chenjun
//节点的下标从0开始计算,节点的序列号从1开始!
public class NodeList{
private int maxNode = 10; //data 链表最大的节点数
private Node node[] = new Node[maxNode]; //节点
//private String name[] = new String[maxNode];
//private String number[] = new String[maxNode];
private int next[] = new int[maxNode]; //下一个节点的下标, 如果是-2表示该节点为空,如果是-1表示为链表的尾部
private int head = 0; //链表头,默认是0;
//默认构造方法
public NodeList(){
for(int i = 0 ; i < this.maxNode ; i++){
this.next[i] = -2;
this.node[i] = new Node();
}
}
public NodeList(int maxNode){
this.maxNode = maxNode;
for(int i = 0 ; i < this.maxNode ; i++){
this.next[i] = -2;
this.node[i] = new Node();
}
}
//查找一个空的节点,返回空节点的下标,如果没有空节点,返回-1
private int searchFree(){
for(int k = 0 ; k < maxNode ; k ++){
if(this.next[k] == -2)
return k;
}
return -1;
}
//找到末节点下标,如果是空链表,则返回-1
private int findEnd(){
int pointer = this.head;
if(this.next[pointer] == -2){
return -1;
}
while(this.next[pointer] != -1){
pointer = this.next[pointer];
}
return pointer;
}
//查找链表第n个节点,并返回其的下标,如果第n个节点不存在,则返回-1
private int findIndex(int n){
if(n < 1)
return -1;
int pointer = this.head;
for(int i = 0 ; i < n - 1 ; i++){
if(this.next[pointer] == -1 || this.next[pointer] == -2){
return -1;
}
pointer = this.next[pointer];
}
return pointer;
}
//增加链表节点,返回新节点的下标,如果创建节点失败,则返回-1
private int creatNode(String name , String number){
int n = this.searchFree();
if (n == -1){
System.out.println("链表的节点已经到达最大的数!");
return n;
}
this.node[n].name = name;
this.node[n].number = number;
return n;
}
//普通的增加一个节点到链表末尾
public void add(String name , String number){
int newNodeIndex = this.creatNode(name , number); //新节点下标
if(newNodeIndex == -1)
return;
//查找末节点,如果不是空链表,将末节点指向新的节点
int endIndex = this.findEnd();
if(endIndex != -1){
this.next[endIndex] = newNodeIndex;
}
this.next[newNodeIndex] = -1;
}
//增加一个节点到链表首部
public void addToHead(String name , String number){
int newNodeIndex = this.creatNode(name , number);
if(newNodeIndex == -1)
return;
if(newNodeIndex == head){
this.next[newNodeIndex] = -1;
}
else{
this.next[newNodeIndex] = head;
this.head = newNodeIndex;
}
}
//增加一个节点到某个固定的序列号下
public void addToMiddle(String name , String number , int index){
if (index < 1){
System.out.println("不能插入到序列号小于1的节点!");
return;
}
else if(index == 1)
this.addToHead(name , number);
else{
int n = this.findIndex(index - 1); //查找前一个节点
if(n == -1){ //前一个节点不存在
System.out.println("插入的序列号过大或者过小!");
return;
}
int newNodeNum = this.creatNode(name , number);
if(newNodeNum == -1)
return;
this.next[newNodeNum] = this.next[n];
this.next[n] = newNodeNum;
}
}
//删除指定序列号的节点
public void del(int index){
int pointer = findIndex(index); //要删除的节点的下标
int back = findIndex(index + 1); //后一节点的下标
int front = findIndex(index - 1); //前一节点的下标
if(pointer == -1){
System.out.println("您想删除的节点不存在!");
return;
}
//如果是删除末节点
if(back == -1 && front != -1){
this.next[pointer] = -2;
this.next[front] = -1;
this.node[pointer] = new Node();
}
//如果是删除首节点
if(back != -1 && front == -1){
this.head = this.next[pointer];
this.next[pointer] = -2;
this.node[pointer] = new Node();
}
//如果是删除中间节点
if(back != -1 && front != -1){
this.next[back] = this.next[pointer];
this.next[pointer] = -2;
this.node[pointer] = new Node();
}
//删除只有一个节点的首节点
if(back == -1 && front == -1){
this.next[pointer] = -2;
this.node[pointer] = new Node();
}
System.out.println("节点删除成功!");
}
//打印数据
public void print(){
//从表头开始打印
System.out.println("链表里的节点:");
int n = this.head;
for(int i = 1 ; i <= maxNode ; i++){
if(this.next[n] == -2){
System.out.println("链表为空!");
return;
}
System.out.print(i + ". ");
System.out.println("姓名: " + this.node[n].name + " 号码: " + this.node[n].number);
if(this.next[n] == -1){
return;
}
n = this.next[n];
}
}
}
//###############链表类测试主程序######################
//文件名:NodeListTest.java
//节点内容为姓名和号码
//2011年8月11日
//write by chenjun
//节点的下标从0开始计算,节点的序列号从1开始!
import java.io.*;
import java.lang.*;
import java.util.*;
public class NodeListTest{
public static void main(String args[]){
NodeList nodeList = new NodeList();
System.out.println("########### 数据结构链表练习 ###########");
while(true){
nodeList.print();
System.out.println("########### 1.输出所有节点 ###########");
System.out.println("########### 2.插入数据到链表尾部 ###########");
System.out.println("########### 3.插入数据到链表头 ###########");
System.out.println("########### 4.插入数据到指定序列号 ###########");
System.out.println("########### 5.删除某个节点 ###########");
System.out.println("########### 0.退出 ###########");
System.out.print("########### 请输入您的选择: ");
InputStream is = System.in;
Scanner scanner = new Scanner(is);
String stringEvent = scanner.next();
int event = Integer.parseInt(stringEvent);
if(event == 0){
break;
}
else if(event == 1){
nodeList.print();
}
else if(event == 2){
System.out.print("请输入姓名:");
String name = scanner.next();
System.out.print("请输入号码:");
String number = scanner.next();
nodeList.add(name , number);
}
else if(event == 3){
System.out.print("请输入姓名:");
String name = scanner.next();
System.out.print("请输入号码:");
String number = scanner.next();
nodeList.addToHead(name , number);
}
else if(event == 4){
System.out.print("想插入的序列号: ");
int index = scanner.nextInt();
System.out.print("请输入姓名:");
String name = scanner.next();
System.out.print("请输入号码:");
String number = scanner.next();
nodeList.addToMiddle(name , number , index);
}
else if(event == 5){
System.out.print("请输入想删除的序列号: ");
int index = scanner.nextInt();
nodeList.del(index);
}
else{
System.out.println("您输入的功能不存在!");
}
System.out.println("");
}
}
}