java实现链表结构

1. 定义节点node


public class Node<T> {


	private Node<T> pre;
	
	private Node<T> next;
	
	private T data;
	
	public void setPre(Node<T> node){
		this.pre = node;
	}
	
	public Node<T> getPre(){
		return pre;
	}
	
	public void setNext(Node<T> node){
		this.next = node;
	}
	
	public Node<T> getNext(){
		return next;
	}
	
	public void setData(T data){
		this.data = data;
	}
	
	public T getData(){
		return this.data;
	}
	
	public Node(Node<T> pre, Node<T> next, T data){
		this.pre = pre;
		this.next = next;
		this.data = data;
	}
	
	public Node(){
		super();
	}
}

2.  创建链表方式1,与c++类似

public class ListDirectNode<T extends Comparable<T>> {

	private byte[] lock = new byte[1];
	
	/**
	 * 链表大小
	 */
	private int size;
	
	/**
	 * 链表头节点
	 */
	private Node<T> header;
	
	/**
	 * 链表尾部节点
	 */
	private Node<T> tail;
	
	public void setHeader(Node<T> node){
		this.header = node;
	}
	
	public Node<T> getHeader(){
		return this.header;
	}
	
	public void setTail(Node<T> node){
		this.tail = node;
	}
	
	public Node<T> getTail(){
		return this.tail;
	}
	
	public int size(){
		return this.size;
	}
	
	public ListDirectNode(){
		size = 0;
		header = new Node<T>(null, null, null);
		tail = new Node<T>(header, null, null);
		header.setNext(tail);
	}
	
	/**
	 * 往链表尾部追加数据
	 * @param data
	 */
	public void add(T data){
		synchronized (lock) {
			Node<T> node = new Node<T>(null, null, data);
			tail.getPre().setNext(node);
			node.setPre(tail);
			node.setNext(tail);
			tail.setPre(node);
			size++;
		}
	}
	
	/**
	 * @param sortType 排序方式
	 * true:升序
	 * false:降序
	 */
	public void sort(boolean sortType){
		for(Node<T> node1 = header.getNext(); node1.getNext() != tail; node1 = node1.getNext()){
			for(Node<T> node2 = node1.getNext(); node2 != tail; node2 = node2.getNext()){
				T d1 = node1.getData();
				T d2 = node2.getData();
				if(sortType){
					if(compare(d1, d2) > 0){
						node1.setData(d2);
						node2.setData(d1);
					}	
				}else{
					if(compare(d1, d2) < 0){
						node1.setData(d2);
						node2.setData(d1);
					}
				}
			}
		}
	}
	
	private int compare(T d1, T d2){
		return d1.compareTo(d2);
	}
	
	public boolean isEmpty(){
		return size==0;
	}
	
	public T get(int index){
		if(index > size || index < 0){
			throw new IndexOutOfBoundsException();
		}
		Node<T> currentNode = new Node<T>(header, null, null);
		for(int i=1; i<=index; i++){
			currentNode = currentNode.getNext();
		}
		return currentNode.getData();
	} 
	
	public void print(){
		int index = 0;
		Node<T> currentNode = header.getNext();
		while(currentNode.getNext() != null){
			index++;
			System.out.println("当前位置:"+index+",当前值"+currentNode.getData().toString());
			currentNode = currentNode.getNext();
		}
	}
}



3. 创建链表方式2,迭代器

public class MyList<T extends Comparable<T>> implements Iterable<T>{

	/**
	 * 链表大小
	 */
	private int size;
	
	/**
	 * 链表头节点
	 */
	private Node<T> header;
	
	/**
	 * 链表下一节点
	 */
	private Node<T> tail;
	
	public void setHeader(Node<T> node){
		this.header = node;
	}
	
	public Node<T> getHeader(){
		return this.header;
	}
	
	public void setTail(Node<T> node){
		this.tail = node;
	}
	
	public Node<T> getTail(){
		return this.tail;
	}
	
	public int size(){
		return this.size;
	}
	
	public MyList(){
		size = 0;
		header = new Node<T>(null, null, null);
		tail = new Node<T>(header, null, null);
		header.setNext(tail);
	}
	
	public void add(T data){
		Node<T> node = new Node<T>(null, null, data);
		tail.getPre().setNext(node);
		node.setPre(tail);
		node.setNext(tail);
		tail.setPre(node);
		size++;
	}
	
	/**
	 * @param sortType 排序方式
	 * true:升序
	 * false:降序
	 */
	public void sort(boolean sortType){
		for(Node<T> node1 = header.getNext(); node1.getNext() != tail; node1 = node1.getNext()){
			for(Node<T> node2 = node1.getNext(); node2 != tail; node2 = node2.getNext()){
				T d1 = node1.getData();
				T d2 = node2.getData();
				if(sortType){
					if(compare(d1, d2) > 0){
						node1.setData(d2);
						node2.setData(d1);
					}	
				}else{
					if(compare(d1, d2) < 0){
						node1.setData(d2);
						node2.setData(d1);
					}
				}
			}
		}
	}
	
	private int compare(T d1, T d2){
		return d1.compareTo(d2);
	}
	
	public void print(){
		int index = 0;
		Iterator<T> iterator = this.iterator();
		while(iterator.hasNext()){
			index++;
			System.out.println("当前位置:"+index+",当前值"+iterator.next().toString());
		}
	}
	
	@Override
	public Iterator<T> iterator() {
		return new MyListIterator<T>();
	}
	
	private class MyListIterator<T> implements Iterator<T>{

		@SuppressWarnings("unchecked")
		Node<T> current = (Node<T>) header.getNext();
		
		@Override
		public boolean hasNext() {
			return current != tail;
		}

		@Override
		public T next() {
			if(!hasNext()){
				throw new IndexOutOfBoundsException();
			}
			T data = current.getData();
			current = current.getNext();
			return data;
		}

		@Override
		public void remove() {
			if(!hasNext()){
				throw new NoSuchElementException();
			}
			current.getPre().setNext(current.getNext());
			current.getNext().setPre(current.getPre());
			current = current.getNext();
			size--;
		}
	}
}



4. 测试代码

public class TestMain {

	public static void main(String[] args){
		ListDirectNode<String> list = new ListDirectNode<String>();
		list.add("a");
		list.add("d");
		list.add("b");
		list.add("e");
		list.sort(true);
		list.print();
		
		MyList<String> list2 = new MyList<String>();
		list2.add("a1");
		list2.add("d1");
		list2.add("b1");
		list2.add("e1");
		list2.sort(true);
		list2.print();
		
		ListDirectNode<Integer> list3 = new ListDirectNode<Integer>();
		list3.add(1);
		list3.add(3);
		list3.add(2);
		list3.add(10);
		list3.sort(false);
		list3.print();

		MyList<Integer> list4 = new MyList<Integer>();
		list4.add(10);
		list4.add(3);
		list4.add(6);
		list4.add(0);
		list4.sort(false);
		list4.print();
	}
}





posted @ 2014-06-26 15:05  marco_tan  阅读(244)  评论(0编辑  收藏  举报