基于利用指针对线性表的实现(单链表)

    链表是由一系列表的结点的对象组成。因为结点是一个独立的对象,因此能够实现独立的节点类。
/*一个链表的节点*/
public class Link {
	private Object element;					//该节点的对象
	private Link next; 						//指向链表的下一个节点
	Link(Object item, Link nextvalue){		//构造方法1
		element = item;
		next = nextvalue;
	}
	Link(Link nextvalue){					//构造方法2
		next = nextvalue;
	}
	Link next(){							//获得下一个节点
		return next;
	}
	Link setNext(Link nextvalue){			//设置下一个节点,成功后返回下一个节点
		return next = nextvalue;
	}
	Object element(){						//获得该节点的对象
		return element;
	}
	Object setElement(Object item){			//设置该节点的对象,成功后返回该对象
		return element = item;				
	}
}//class Link

    每个节点只有一个指向表中的下一个节点的指针,因此实现的线性表为单链表,

    实现的单链表具有表头结点。表头结点是表的第一个结点,他与表中其他元素一样,只是他的值被忽略,不被看作表中的实际元素。添加表头结点的目的是使当前指针current指向当前元素的前驱结点,使得插入等操作变得简易,降低源代码的复杂性。(注:当当前指针current指向当前结点时,向当前位置插入新对象时,需要从头结点依次向后寻找,知道找到当前元素的前驱结点后,才能进行添加。并且需要考虑链表中无节点与只有一个结点的特殊情况。)

/*链表:利用指针实现*/
public class LinkList implements List{
	
	private Link head; 					//指向表的头结点
	private Link tail;					//指向表的尾节点
	protected Link current; 		//保存当前节点
	
	LinkList(int size){					//构造方法-忽略大小
		setup();
	}
	
	LinkList(){							//无参构造方法
		setup();
	}
	
	private void setup(){				//初始化操作
		tail = head = current = new Link(null);	//创造头结点
	}
	
	public void clear(){				//从列表中移除所有的对象
		head.setNext(null);				//终止访问其他节点
		current= tail = head;			//重新初始化
	}
	
	//在当前位置插入对象
	public void insert(Object item){
		assert (current != null) : "无当前元素";
		current.setNext(new Link(item, current.next()));
		if(tail == current){
			tail = current.next();
		}
	}
	
	//从链表尾部添加对象
	public void append(Object item){
		tail.setNext(new Link(item, null));
		tail = tail.next();
	}
	
	//移除并返回当前对象
	public Object remove(){
		if(!isInList()){
			return null;
		}else{
			Object item = current.next().element();			//得到当前对象的值
			if(tail == current.next()){						//设置尾结点
				tail = current;
			}
			current.setNext(current.next().next());			//从链表中中移除对象
			return item;									//返回移除的值
		}
	}
	
	//移除所有对象
	public void removeAll(){
		head.setNext(null);				//终止访问其他节点
		current= tail = head;			//重新初始化
	}
	
	//设置当前位置为第一个位置
	public void setFirst(){
		current = head;
	}
	
	//移动当前位置至下一位置
	public void next(){
		if(current != null){
			current = current.next();
		}
	}
	
	//移动当前位置至上一位置
	public void previous(){
		if((current == null) || (current == head)){	//上一位置无对象
			current = null;
			return;
		}
		Link temp = head;
		while((temp != null) && (temp.next() != current)){	//从头结点开始检索
			temp.next();
		}
		current = temp;
	}
	
	//返回链表的长度
	public int length(){
		int cnt = 0;
		for(Link temp = head.next(); temp != null; temp = temp.next()){
			cnt++;
		}
		return cnt;
	}
	
	//设置当前位置至指定位置
	public void setPosition(int pos){
		current = head;
		for(int i=0; (current != null) && (i < pos); i++){
			current = current.next();
		}
	}
	
	//设置当前对象的值
	public void setValue(Object item){
		assert isInList() : "链表内无该对象";
		current.next().setElement(item);
	}
	
	//获得当前对象的值
	public Object currentValue(){
		if(!isInList()){
			return null;
		}
		return current.next().element();
	}
	
	//是否为空链表
	public boolean isEmpty(){
		return head.next() == null;
	}
	
	//是否在列表中
	public boolean isInList(){
		return (current != null) && (current.next() != null);
	}
	
	//打印链表
	public void print(){
		if(isEmpty()){
			System.out.println("()");
		}else{
			System.out.print("(");
			for(setFirst(); isInList(); next()){
				System.out.print(currentValue()+" ");
			}
			System.out.println(")");
		}
	}
}//class LinkList


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值