Java泛型的应用-双链表

Java不支持泛型数组。

使用泛型来规定链表中元素的类型。

DLinkList接口:

 
 
package cn.ltp.dlinklist;

/**
 * 双向链表
 * @author Z7M-SL7D2
 *
 */
interface DLinkList<T> {
	
	/**
	 * 添加节点
	 * @param data 节点的数据
	 */
	void add(T data);
	
	/**
	 * 删除节点
	 * @param data 节点的数据
	 */
	void remove(T data);
	
	/**
	 * 修改位于index位置的节点
	 * @param index 节点所在位置
	 * @param data 节点的数据
	 */
	void set(int index, T data);
	
	/**
	 * 获取位于index位置节点的数据
	 * @param index 节点所在位置
	 * @return
	 */
	T get(int index);
	
	/**
	 * 获取节点个数
	 * @return
	 */
	int getSize();
	
	
	/**
	 * 是否包含某个节点
	 * @param data 数据
	 * @return
	 */
	boolean contains(T data);
	
	/**
	 * 打印节点
	 */
	void printList();
	
	/**
	 * 判空
	 * @return
	 */
	boolean isEmpty();
	
	/**
	 * 清空
	 */
	void clear();
	
	/**
	 * 转数组
	 * @return
	 */
	Object[] toArray();
	
}

实现

 
 
 
 
package cn.ltp.dlinklist;

public class DLinkListImpl<T> implements DLinkList<T> {

	private Node first;
	private Node last;
	private int size;

	private class Node {
		private Node next;
		private Node prev;
		private T data;

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

	}

	@Override
	public void add(T data) {
		if (first == null) {
			Node node = new Node(null, null, data);
			first = node;
			last = node;
		} else {
			Node node = new Node(null, last, data);
			last.next = node;
			last = node;
		}
		this.size++;

	}

	@Override
	public void remove(T data) {
		if (data == null) {
			for (Node cur = this.first; cur != null;) {
				Node tmp = cur.next;
				if (cur.data == null) {
					if (cur == first) {
						if (cur == last) {
							cur = null;
						} else {
							first = cur.next;
							cur.next = null;
							cur = null;
							first.prev = null;
							cur = first;
						}
					} else if (cur == last) {
						last = cur.prev;
						cur.prev = null;
						cur = null;
						last.next = null;
						cur = tmp;
					} else {
						cur.prev.next = cur.next;
						cur.next.prev = cur.prev;
						cur.next = null;
						cur.prev = null;
						cur = null;
						cur = tmp;
					}
					this.size--;
				} else {
					cur = cur.next;
				}
			}
		} else {
			for (Node cur = this.first; cur != null;) {
				Node tmp = cur.next;
				if (data.equals(cur.data)) {
					if (cur == first) {
						if (cur == last) {
							cur = null;
						} else {
							first = cur.next;
							cur.next = null;
							cur = null;
							first.prev = null;
							cur = first;
						}
					} else if (cur == last) {

						last = cur.prev;
						cur.prev = null;
						cur = null;
						last.next = null;
						cur = tmp;
					} else {

						cur.prev.next = cur.next;
						cur.next.prev = cur.prev;
						cur.next = null;
						cur.prev = null;
						cur = null;
						cur = tmp;
					}
					this.size--;
				} else {
					cur = cur.next;
				}
			}
		}
	}

	@Override
	public void set(int index, T data) {
		Node node = node(index);
		if (node != null)
			node.data = data;
	}

	@Override
	public T get(int index) {
		Node node = node(index);
		if (node != null)
			return node.data;
		else {
			try {
				throw new NullPointerException();
			} catch (NullPointerException e) {
				System.out.println("Null:no such element");
				return null;
			}

		}

	}

	@Override
	public int getSize() {
		return this.size;
	}

	private Node node(int index) {
		if (index >= this.size)
			return null;
		int len = this.size;
		if (index < len) {
			if (index > len / 2) {
				Node cur = last;
				int step = len - index - 1;
				while (step-- > 0) {
					cur = cur.prev;
				}
				return cur;
			} else {
				Node cur = first;
				int step = index;
				while (step-- > 0) {
					cur = cur.next;
				}
				return cur;
			}
		}
		return null;
	}

	@Override
	public void printList() {
		int count = this.size;
		Node cur = first;
		System.out.print("打印链表元素:");
		
		while (count-- > 0) {
			System.out.print("  " + cur.data);
			cur = cur.next;
		}
		
		System.out.println();
	}

	@Override
	public boolean contains(T data) {
		if (data == null) {
			
			for (Node cur = this.first; cur != null; cur = cur.next) {
				if (cur.data == null)
					return true;
			}
			
		} else {
			
			for (Node cur = this.first; cur != null; cur = cur.next) {
				if (data.equals(cur.data))
					return true;
			}
			
		}
		return false;
	}

	@Override
	public boolean isEmpty() {
		return this.size <= 0;
	}

	@Override
	public void clear() {
		Node cur = first;
		Node tmp = null;
		
		while (cur != null) {
			tmp = cur.next;
			cur.next = null;
			cur.prev = null;
			cur = tmp;
		}
		
		first = last = null;
		this.size = 0;
	}

	@Override
	public Object[] toArray() {
		if (size <= 0)
			return null;

		// 不支持泛型数组
		Object[] arr = new Object[this.size];
		int i = 0;

		for (Node cur = first; cur != null; cur = cur.next, i++)
			arr[i] = cur.data;

		return arr;
	}

}

测试:

package cn.ltp.dlinklist;

public class Test {

	public static void main(String[] args) {
		Factory factory = new Factory();
		DLinkList<Number> dList = factory.getInstance();
		dList.add(6);
		dList.add(2);
		dList.add(3);
		dList.add(6);
		dList.add(7.5);
		dList.add(6);
		dList.add(6);
		dList.add(null);
		dList.add(6);
		dList.add(null);
		dList.printList();
		
		System.out.println("是否包含元素100:" + dList.contains(100));
		System.out.println("第9个元素为" + dList.get(9));
		
		System.out.println("删除链表为空的元素:");
		dList.remove(null);
		dList.printList();
		
		System.out.println("删除链表为6的元素:");
		dList.remove(6);
		dList.printList();
		Object[] arr = dList.toArray();
		
		System.out.println("转数组");
		for(Object object : arr)
			System.out.print(object + " ");
		
		System.out.println("\n清空数组");
		dList.clear();
		dList.printList();
	}
}

使用Number类,可以添加所有的数值类型的元素



猜你喜欢

转载自blog.csdn.net/bugggget/article/details/80108695