Java数据结构(一) ---链表

总共分为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("");
		}
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值