JAVA 实现线性表之链表

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);
	}
}



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值