Java实现简单的数据结构(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_29194935/article/details/60768675

2.LinkedList

import java.util.NoSuchElementException;

import org.junit.Test;

public class LinkedList implements List {

	private Node first;

	private Node last;

	private int size;

	/**
	 * 头部添加节点方法
	 */
	private void linkFirst(Object o) {
		final Node node = first;
		final Node firstNode = new Node(o, node, null);
		this.first = firstNode;
		if (node == null) {
			last = firstNode;
		} else {
			node.prev = firstNode;
		}
		size++;
	}

	/**
	 * 末端添加节点方法
	 * 
	 * @param o
	 */
	private void linkLast(Object o) {
		final Node node = last;
		final Node lastNode = new Node(o, null, node);
		last = lastNode;
		if (node == null) {
			first = lastNode;
		} else {
			node.next = lastNode;
		}
		size++;
	}

	/**
	 * 在链表末端添加节点
	 */
	public void add(Object o) {
		if (o != null)
			linkLast(o);
	}

	/**
	 * 在指定下标处添加节点
	 */
	public void add(int index, Object o) {
		checkIndex(index);
		Node befo = getNodeByIndex(index);
		linkBefore(o, befo);
	}

	/**
	 * 根据下标获取节点
	 */
	public Object get(int index) {
		checkIndex(index);
		return getNodeByIndex(index).data;
	}

	/**
	 * 根据下标移除节点
	 */
	public Object remove(int index) {
		checkIndex(index);
		Node current = getNodeByIndex(index);
		final Node node = current;
		final Node prev = node.prev;
		final Node next = node.next;
		if (prev == null) {
			first = next;
		} else {
			prev.next = next;
			next.prev = prev;
			current = null;
		}
		if (next == null) {
			last = prev;
		} else {
			prev.next = next;
			next.prev = prev;
			current = null;
		}
		size--;
		return node.data;
	}

	/**
	 * 返回链表长度
	 */
	public int size() {
		return size;
	}

	/**
	 * 在链表头添加节点
	 * 
	 * @param o
	 */
	public void addFirst(Object o) {
		linkFirst(o);
	}

	/**
	 * 在链表最后添加节点
	 * 
	 * @param o
	 */
	public void addLast(Object o) {
		linkLast(o);
	}

	/**
	 * 移除链表首个元素
	 * 
	 * @return
	 */
	public Object removeFirst() {
		Node node = first;
		if (node == null)
			throw new NoSuchElementException();
		else {
			Node next = node.next;
			if (next == null)
				first = null;
			else {
				first = next;
				first.prev = null;
			}
		}
		size--;
		return node.data;
	}

	/**
	 * 移除链表最后一个元素
	 * 
	 * @return
	 */
	public Object removeLast() {
		Node node = last;
		if (last == null)
			throw new NoSuchElementException();
		else {
			Node prev = node.prev;
			if (prev == null)
				last = null;
			else {
				last = prev;
				last.next = null;
			}
		}
		size--;
		return node.data;
	}

	/**
	 * 迭代方法
	 * 
	 * @return
	 */
	public Iterator iterator() {
		return new Iter();
	}

	/**
	 * 在节点之前插入一个新的节点
	 * 
	 * @param data
	 * @param befo
	 */
	private void linkBefore(Object data, Node befo) {
		final Node prev = befo.prev;
		final Node node = new Node(data, befo, prev);
		befo.prev = node;
		if (prev == null)
			first = node;
		else
			prev.next = node;
		size++;
	}

	/**
	 * 根据下标获取节点
	 * 
	 * @param index
	 * @return
	 */
	private Node getNodeByIndex(int index) {
		checkIndex(index);

		Node node = first;
		for (int x = 0; x < index; x++) {
			node = node.next;
		}
		return node;
	}

	/**
	 * 检查下标是否越界
	 * 
	 * @param index
	 */
	private void checkIndex(int index) {
		// TODO Auto-generated method stub
		if (index < 0 || index > size) {
			throw new IndexOutOfBoundsException("链表下标越界");
		}
	}

	/**
	 * 迭代器内部类
	 * 
	 * @author Adminstater
	 * 
	 */
	private class Iter implements Iterator {
		private int nextIndex = 0;

		@Override
		public boolean hasNext() {
			// TODO Auto-generated method stub
			return nextIndex != size;
		}

		@Override
		public Object next() {
			// TODO Auto-generated method stub
			int i = nextIndex++;
			if (i > size - 1)
				throw new IndexOutOfBoundsException();
			return getNodeByIndex(i).data;
		}

	}

	/**
	 * 节点内部类
	 * 
	 * @author Adminstater
	 * 
	 */
	private static class Node {
		Object data;
		Node next;
		Node prev;

		private Node(Object data, Node next, Node prev) {
			this.data = data;
			this.next = next;
			this.prev = prev;
		}

		private Node() {

		}
	}

	/*------------------------------------------------------单元测试----------------------------------------------------*/

	/**
	 * 测试添加方法功能
	 */
	// add(Object o)
	@Test
	public void TestAddFunction() {

		LinkedList list = new LinkedList();
		for (int i = 0; i < 100; i++) {
			list.add(i);
		}
		System.out.println("添加完毕");

	}

	// add(int index,Object o)
	@Test
	public void TestAddIndexFunction() {
		LinkedList list = new LinkedList();
		for (int i = 0; i < 100; i++) {
			list.add(i);
		}
		for (int x = 0; x < list.size(); x++) {
			System.out.println(list.get(x));
		}
		list.add(3, 111);
		System.out.println(list.get(3));
	}

	// addFirst(Object o)
	@Test
	public void TestAddFirstFunction() {
		LinkedList list = new LinkedList();
		for (int i = 0; i < 100; i++) {
			list.add(i);
		}
		System.out.println(list.get(0));
		list.addFirst(20);
		System.out.println(list.get(0));
	}

	// addLast(Object o)
	@Test
	public void TestAddLastFunction() {
		LinkedList list = new LinkedList();
		for (int i = 0; i < 100; i++) {
			list.add(i);
		}
		System.out.println(list.get(list.size() - 1));
		list.addLast(111);
		System.out.println(list.get(list.size() - 1));
	}

	/**
	 * remove方法测试
	 */
	// removeFirst()
	@Test
	public void TestRemoveFirst() {
		LinkedList list = new LinkedList();
		for (int i = 0; i < 100; i++) {
			list.add(i);
		}
		System.out.println(list.get(0));
		list.removeFirst();
		System.out.println(list.get(0));
	}

	// removeLast()
	@Test
	public void TestRemoveLast() {
		LinkedList list = new LinkedList();
		for (int i = 0; i < 100; i++) {
			list.add(i);
		}
		System.out.println(list.get(list.size() - 1));
		list.removeLast();
		System.out.println(list.get(list.size() - 1));
	}

	// remove(int index)
	@Test
	public void TestRemoveFunction() {
		LinkedList list = new LinkedList();
		for (int i = 0; i < 100; i++) {
			list.add(i);
		}
		System.out.println(list.get(50));
		list.remove(50);
		System.out.println(list.get(50));
	}

	/**
	 * Iterator测试
	 */
	@Test
	public void TestIterator() {
		LinkedList list = new LinkedList();
		for (int i = 0; i < 100; i++) {
			list.add(i);
		}
		Iterator ite = list.iterator();
		while (ite.hasNext()) {
			System.out.println(ite.next());
		}
	}

	public static void main(String[] args) {
		java.util.LinkedList list = null;
	}
}


猜你喜欢

转载自blog.csdn.net/sinat_29194935/article/details/60768675
今日推荐