Linkbox双向链表

最近看了一下LinkedList,就自己动手简单封装了一下LinkBox
实现的功能:
add() get() remove() modify() size() 增删改查的这几个基本方法
也顺便复习了一下接口
box接口
写了上面几个基本方法

package mybox;
/*
 * box接口
 */
public interface Box {
     public void add(int item);   //添加
     public int get(int inder);   //获取
     public void remove(int inder);   //删除
     public void modify(int inder,int x); //修改
     public int size();         //元素个数
}

接着是节点类的创建

package mybox;
/*
 * 数据节点
 */
public class Node {
     private Node prev;   //上一个对象
     private int item;      //保存的数据
     private Node next;    //下一个对象
     public Node(Node prev,int item,Node next) {
    	 this.prev = prev;
    	 this.item = item;
    	 this.next = next;
     }
     public Node getprev() {    
    	 return this.prev;
     }
     public Node getnext() {
    	 return this.next;
     }
     public int getitem() {
    	 return this.item;
     }
     public void setprev(Node prev) {    
    	this.prev = prev;
     }
     public void setnext(Node next) {
    	this.next = next;
     }
     public void setitem(int item) {
    	this.item = item;
     }
}

最后是LinkBox的封装

package mybox;
/*
 * 双向链表
 * 继承Box
 * implements   实现接口
 * extends      继承
 */
public class LinkBox implements Box{
    private Node first;    //头节点
	private Node last;    //尾节点
	private int size = 0;     //有效元素个数
	
	private void Check(int inder) {         //检查序号是否合法
		if(inder >= this.size || inder < 0) {
			throw new ArithmeticException("序号异常");
		}
	}
	private Node search(int inder) {            //根据序号查找对应的Node
		Node node = null;
		Node l =last;
		Node f = first;
		if(inder >= size/2)  //从后面遍历
		{
			
			for(int i=size-1; i>=inder; i--)
			{
				node = l;
				l = node.getprev();
			}
		}
		else //从前面遍历
		{
			for(int i=0;i<=inder;i++)
			{
				node = f;
				f = node.getnext();
			}
		}
		return node;
	}
	private void delem(Node node) {            //删除
		Node prev = node.getprev();  //这个节点的前一个
		Node next = node.getnext();  //这个节点的后一个
		if(prev == null)  //如果他的前一个是空,说明他是头节点
		{
			node.setnext(null);     //把他下一个置空
			next.setprev(null);    //把他下一个的上一个置空
			first = next;     //头节点
		}
		else if(next == null)   //如果他的前一个是空,说明他是尾节点
		{
			node.setprev(null);    //把他上一个置空
			prev.setnext(null);    //把他上一个的下一个置空
			last = prev;
		}
		else    //如果不是头节点和尾节点
		{
			prev.setnext(next);     
			next.setprev(prev);
		}
		size--; //元素减1
	}
	//添加元素至尾端
	public void add(int item) { 
		Node l = last; //获取尾节点
		Node newnode = new Node(l,item,null); //创建一个Node将数据包装起来
		last = newnode;  //再将自己设置为last
		if(l == null)  //如果之前的尾节点为空,那么新加进来的节点是第一个节点
		{
			first = newnode;
		}
		else   //否则的话,之前的last的下一个,就是newnode的上一个
		{
			l.setnext(newnode);
			newnode.setprev(l);
		}
		size++;      //有效元素加1
	}
	//取对应序号的值
	public int get(int inder) {              
		Check(inder);         //检查参数是否合法
		//如果没有抛出异常就继续下一步
		Node node = search(inder);
		
		return node.getitem();
	}
   //删除对应序号的值
	public void remove(int inder) {
		Check(inder);     //检查参数是否合法
		Node node = search(inder);   //找到后
		delem(node); //删除
	}
	//修改对应序号的值
	public void modify(int inder,int x)   //修改的序号,修改后的值
	{
		Check(inder);  //检查参数
		Node node = search(inder);  //查找这个Node
		node.setitem(x);   //再修改
	}
    //获得元素个数
	public int size() {
		
		return size;
	}
	//打印所有元素
	public void print()
	{
		Node l = first;
		for(int i=0;i<size;i++)
		{
			System.out.println(l.getitem());
			l = l.getnext();
		}
	}

}

经过这个的联系,让自己对LinedList更加熟悉了一点,以及双向链表的增删改查也更熟悉了
有错请留言,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值