`
BradyZhu
  • 浏览: 247713 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

(数据结构与算法分析 二)------单链表的实现,使用链表迭代器

 
阅读更多

Java实现链表能够很好的封装对指针的实现,让用户使用的时候不会感受到指针的繁琐,但是可能会带来效率的降低。

这个链表是一个单链表的实现,使用了链表迭代器,刚开始看的时候感觉有些很不舒服,但是使用起来明显能感受功能带来的效果,因为你可以脱离链表而独自操作,可以同时对链表进行前后的遍历。提高时间效率,但是同样也得操作带来了麻烦。我觉的还是直接使用链表比较好,但是作为一种思想,还是值得学习学习,说不定是因为现在水平太低呢,呵呵,留着备用吧,下面上代码

第一个是链表的节点实现

package com.bird.three;

/**
 * @category 该类为链表的节点类,存储指针和数据
 * @author Bird
 *
 */
public class ListNode {//具有包友好访问权限
	Object element;
	ListNode next;
	
	ListNode(Object theElement){
		this(theElement,null);
	}
	
	ListNode(Object theElement, ListNode n){
		element = theElement;
		next = n;
	}
}

第二个是枚举器,实现对提供表元素的访问

package com.bird.three;

/**
 * @category 枚举器类,提供读取表元素的方法
 * @author Bird
 *
 */
public class LinkedListItr {
	ListNode current;//记录当前节点位置,具有包访问权限
	
	public LinkedListItr(ListNode theNode){
		current = theNode;
	}
	
	public boolean isPastEnd(){
		return current == null;
	}
	
	public Object retrieve(){//返回存储在当前位置上的元素
		return isPastEnd() ? null : current.element;
	}
	
	public void advance(){//将当前位置推进到下一个节点位置
		if(!isPastEnd())
			current = current.next;
	}
}

第三个链表的实现

package com.bird.three;

/**
 * @category 链表的实现
 * @author Bird
 *
 */
public class LinkedList {
	private static ListNode header;
	
	public LinkedList(){
		header = new ListNode(null);//头结点赋值为空
	}
	
	public boolean isEmpty(){
		return header.next == null;
	}
	
	public void makeEmpty(){
		header.next = null;
	}
	
	public LinkedListItr zeroth(){//返回对应于头结点的枚举器
		return new LinkedListItr(header);
	}
	
	public LinkedListItr first(){//返回第一个节点的枚举器
		return new LinkedListItr(header.next);
	}
	
	public LinkedListItr find(Object x){//根据指定的元素找到相对应的节点,并且返回迭代器
		ListNode itr = header.next;
		while(itr != null && !itr.element.equals(x))
			itr = itr.next;
		
		return new LinkedListItr(itr);
	}
	
	public LinkedListItr findPrevious(Object x){//注意,这个返回的是X的前驱节点
		ListNode itr = header;
		while(itr.next != null && !itr.next.element.equals(x))
			itr = itr.next;
		
		return new LinkedListItr(itr);
	}
	
	public void remove(Object x){
		LinkedListItr p = findPrevious(x);
		
		if(p.current.next != null)
			p.current.next = p.current.next.next;
	}
	
	public void insert(Object x, LinkedListItr p){
		if(p!=null && p.current != null)
			p.current.next = new ListNode(x,p.current.next);
	}
	
	
	public void printList(LinkedList theList){
		if(theList.isEmpty())
			System.out.println("Empty List");
		else{
			LinkedListItr itr = theList.first();
			for(; !itr.isPastEnd(); itr.advance())
				System.out.println(itr.retrieve()+" ");
		}
		System.out.println();
	}
	
	
	public static void main(String[] args){
		LinkedList list = new LinkedList();
		System.out.println(header);
		System.out.println(header.next);
		list.printList(list);
	}
	
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics