java (双)链表实现

原创 2013年12月04日 10:25:47

 

package hb.struct;


/**
 * 双向链表
 * @author huangbiao
 * @date 2013-9-20
 */
public class MyList {

	public static void main(String[] args) {
		MyList mylist = new MyList();
		mylist.addFirst("huangbiao_first1");
		mylist.addFirst("huangbiao_first2");
		mylist.addLast("huangbiao_last1");
		mylist.addLast("huangbiao_last2");
		
		System.out.println("-------------add(int,Object)-------------------");
		mylist.add(1, "add(int,Object)");
		mylist.addBefor("addBefore", mylist.getNode(2));
		
		for(int i=0;i<mylist.size;i++){
			System.out.println(mylist.getNode(i).getItem());
		}
		
		System.out.println("-------------getFirst()-------------------");
		System.out.println(mylist.getFirst().getItem());
		System.out.println(mylist.getLast().getItem());
		
		System.out.println("-------------remove(Node)-------------------");
		
		try {
			mylist.remove(mylist.getNode(2));
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		for(int i=0;i<mylist.size;i++){
			System.out.println(mylist.getNode(i).getItem());
		}
		
		System.out.println("-------------remove(int)-------------------");
		
		try {
			mylist.remove(2);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		for(int i=0;i<mylist.size;i++){
			System.out.println(mylist.getNode(i).getItem());
		}
		
		System.out.println("------------removeLast()--------------------");
		
		mylist.removeLast();
		
		for(int i=0;i<mylist.size;i++){
			System.out.println(mylist.getNode(i).getItem());
		}
		
	}

	private Node head;
	private Node tail;
	private int size;

	MyList() {
		head = new Node();
		tail = new Node();
		head.setNext(tail);
		tail.setPre(head);
		size = 0;
	}
	
	public Node getNode(int i){
		Node result = head;
		if(0<= i && i < size){
			for (int j = 0; j <= i; j++)
				result = result.next;
		}else{
			return result;
		}
		return result;
	}
	
	public Node getFirst(){
		Node result = null;
		if(size > 0){
			result = head.next;
		}
		return result;
	}
	
	public Node getLast(){
		Node result = null;
		if(size > 0){
			result = tail.pre;
		}
		return result;
	}
	
	private boolean isPositionIndex(int i){
		return i>=0 && i<=size;
	}
	
	private void checkPositionIndex(int i){
		if(!isPositionIndex(i)){
			throw new IndexOutOfBoundsException(outOfBoundsMsg(i));
		}else{
			return ;
		}
	}
	
	private String outOfBoundsMsg(int i) {
		return (new StringBuilder()).append("Index: ").append(i).append(", Size: ").append(size).toString();
	}

	public void addFirst(Object item) {
		Node n = new Node(item, head, head.getNext());
		head.getNext().setPre(n);
		head.setNext(n);
		size++;
	}
	
	public int size(){
		return this.size;
	}
	
	public void add(int index,Object item){
		checkPositionIndex(index);
		if (index == size)
			addLast(item);
		else
			addBefor(item, getNode(index));
	}
	
	public void addBefor(Object obj,Node beforeNode){
		Node node2 = beforeNode.pre;
		Node node = new Node(obj,node2,beforeNode);
		//
		beforeNode.pre = node;
		node2.next = node;
		size++;
	}
	

	public void addLast(Object item) {
		Node n = new Node(item, tail.getPre(), tail);
		tail.getPre().setNext(n);
		tail.setPre(n);
		size++;
	}

	public void remove(Node node) throws Exception {
		Node n = check(node);
		n.getPre().setNext(n.getNext());
		n.getNext().setPre(n.getPre());
		size--;
	}
	
	public void remove(int index) throws Exception{
		if(index<=size){
			Node target = head;
			for(int i=0;i<this.size;i++){
				target = target.next;
			}
			this.remove(target);
		}
	}
	
	public void removeLast(){
		if(size>0){
			Node last = tail.pre;
			last.pre.setNext(last.next);
			last.next.setPre(last.pre);
			size--;
		}
	}

	protected Node check(Node node) throws Exception {
		if (node == null) {
			throw new Exception("节点为空!");
		}
		if (node == head) {
			throw new Exception("节点不能指向头节点!");
		}
		if (node == tail) {
			throw new Exception("节点不能指向尾节点!");
		}
		return node;
	}

	/**
	 * 定义了一个类为node,用来存储数据
	 * @author Administrator
	 */
	private class Node {
		Object item;
		Node pre;
		Node next;

		Node(Object item, Node pre, Node next) {
			this.item = item;
			this.pre = pre;
			this.next = next;
		}

		Node(Object item) {
			this(item, null, null);
		}

		Node() {
			this(null, null, null);
		}

		public Object getItem() {
			return item;
		}

		public void setItem(Object item) {
			this.item = item;
		}

		public Node getPre() {
			return pre;
		}

		public void setPre(Node pre) {
			this.pre = pre;
		}

		public Node getNext() {
			return next;
		}

		public void setNext(Node next) {
			this.next = next;
		}

	}
}

 

打印结果:

-------------add(int,Object)-------------------

huangbiao_first2

add(int,Object)

addBefore

huangbiao_first1

huangbiao_last1

huangbiao_last2

-------------getFirst()-------------------

huangbiao_first2

huangbiao_last2

-------------remove(Node)-------------------

huangbiao_first2

add(int,Object)

huangbiao_first1

huangbiao_last1

huangbiao_last2

-------------remove(int)-------------------

huangbiao_first2

add(int,Object)

huangbiao_first1

huangbiao_last1

------------removeLast()--------------------

huangbiao_first2

add(int,Object)

huangbiao_first1

相关文章推荐

java实现链表操作

  • 2015年10月24日 13:57
  • 2KB
  • 下载

基于JAVA的单链表简单实现

  • 2013年01月05日 23:07
  • 5KB
  • 下载

面试题三:使用 java 实现单向链表的倒置

我理解的链表倒置的意思应该是比如 a->b 变成 b->a , 核心算法不难, a->b->c->d->f a->null  b->c->d->f b->a->null c->d->...
  • hhooong
  • hhooong
  • 2016年04月05日 16:35
  • 936

java实现单链表

  • 2015年04月04日 15:28
  • 2KB
  • 下载

java实现的单链表及逆序显示

  • 2008年10月30日 18:47
  • 4KB
  • 下载

数据结构——把数据项按顺序插入到链表中(java实现)

今天要记录的是有序链表,前几篇讲到的链表都是无序的,说他无序就是指没有什么规律的、乱序的,将这类链表输出后会发现,其输出顺序与操作链表时的输入顺序有很大关系——要么与输入顺序顺序相同要么与输入顺序相反...

链表的JAVA实现代码

  • 2013年05月03日 21:57
  • 3KB
  • 下载

Java实现单链表数据结构

这两天翻了下大二学习的数据结构教材,因为是C++版的,看完线性表的连接存储结构—单链表,用C++实现不是很难。因为学习了java,所以就思考着如何用java实现单链表。但是C++使用的是指针,而Jav...

Java实现的循环链表源码

  • 2010年04月09日 14:17
  • 3KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java (双)链表实现
举报原因:
原因补充:

(最多只允许输入30个字)