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实现

一:单向链表基本介绍链表是一种数据结构,和数组同级。比如,Java中我们使用的ArrayList,其实现原理是数组。而LinkedList的实现原理就是链表了。链表在进行循环遍历时效率不高,但是插入和...
  • jianyuerensheng
  • jianyuerensheng
  • 2016年04月20日 13:57
  • 30005

用java简单的实现单链表的基本操作

此代码仅供参考,如有疑问欢迎评论: package com.tyxh.link; //节点类 public class Node { protected Node next; //指针域 ...
  • tayanxunhua
  • tayanxunhua
  • 2013年09月04日 23:41
  • 89001

用链表实现栈(Java版)

用链表实现栈 一、算法的思想 用链表实现栈的先进后出,实现栈的push,pop,peak方法。主要就是利用链表的头结点作为栈顶的元素。 1.当要push的时候,相当于新new一个头结点,然后让新...
  • ly969434341
  • ly969434341
  • 2016年05月23日 21:46
  • 2499

利用链表实现队列的Java代码

利用链表实现队列的Java代码佟强 http://blog.csdn.net/microtongQueueNode类是用来表示一个链表节点的类,QueueLinked是链表实现的队列,其中front是...
  • microtong
  • microtong
  • 2009年10月01日 21:56
  • 4444

Java链表的实现

传统的对象数据一旦声明则长度不可改变,因此,操作起来较为繁杂。 链表从本质上讲可以理解为“动态的对象数组”。链表可以实现对象的增加、删除、查询等等一系列的操作,可以实现动态扩充。如下为链表的实现: 1...
  • fengfeng2861285642
  • fengfeng2861285642
  • 2016年08月24日 21:07
  • 360

Java单链表、双端链表、有序链表实现

单链表: insertFirst:在表头插入一个新的链接点,时间复杂度为O(1) deleteFirst:在表头插入一个新的链接点,时间复杂度为O(1) 有了这两个方法,就可以用单链表来实现...
  • a19881029
  • a19881029
  • 2014年03月31日 23:45
  • 60718

数据结构:链表大解析(java实现)

¥本文内容主要总结链表的的相关知识与常见题目一、链表的定义链表是线性表的链式存储的实现(物理顺序可以是任意的,不一定要与逻辑顺序一致)。线性表是指存储相同类型的一组数据,除了第一个和最后一个元素外,每...
  • lilianforever
  • lilianforever
  • 2016年08月09日 20:51
  • 2655

Java中队列的实现(2)-使用单向链表以及实现

队列(Queue):是另一种被限制过的线性表,它是固定一端来插入数据元素,另一端只删除元素,也就是说队列中的元素移动是固定的,就像超市收银台一样,一边是进的,一边是出的,而且是先进入的首先获得服务的。...
  • daguairen
  • daguairen
  • 2016年10月06日 19:50
  • 1194

java用链表实现堆栈和队列

链表是基本的数据结构,在C语言中的基本结构如下:         struct  List {                  int data;//数据                  s...
  • zzobin
  • zzobin
  • 2011年12月13日 22:43
  • 4420

Java小程序之自定义链表的实现

Java小程序之自定义链表的实现 一、前面我们自己实现了队列,和画板的重绘有关;今天我们实现自定义链表; 二、自定义链表实现源代码: 节点类: package Test; //定义节点...
  • BlueSky_USC
  • BlueSky_USC
  • 2017年01月06日 18:19
  • 1118
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java (双)链表实现
举报原因:
原因补充:

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