Java双向链表的实现

来源:互联网 发布:淘宝上的外卖是美团吗 编辑:程序博客网 时间:2024/05/14 03:37

原文地址:http://blog.csdn.net/yangchuxi/article/details/6621057

看链表的时候还是用c中指针那种思维来思考比较容易理解,c很久以前学的都忘得差不多了,需要补补鸟……

在上面文章所写的基础上拿来改了下,添加了类似list集合get()方法,直接通过索引得到节点对象,节点对象里的Object成员变量就是用来存储数据,可以在这个基础你在自己封装一下,我就部封装鸟……


/*** @Description : 描述* @author YangXuan* @email 364105996@qq.com* @date 2013-11-28 上午12:35:19*/public class TWLink {/** * @Description : 节点实体 */@SuppressWarnings("hiding")class Node<Object> {private Object object;private Node<Object> next;private Node<Object> pre;public Node(Object object) {this.object = object;this.next = null;this.pre = null;}public String toString() {return object.toString();}}private Node<Object> head;private int size;/** * 链表的初始化 */public TWLink() {size = 0;head = new Node<Object>(null);head.next = null;head.pre = null;}/** * 插入到链表前段(表头之后) */public boolean insertFirst(Node<Object> node) {if (node != null) {if (head.next != null) {node.pre = head;node.next = head.next;head.next.pre = node;head.next = node;} else {head.next = node;node.pre = head;}size++;return true;}return false;}/** * 插入到链表的末尾 */public boolean insertLast(Node<Object> node) {if (node != null) {Node<Object> current = head;while (current.next != null) {current = current.next;}current.next = node;node.pre = current;size++;return true;}return false;}/** * 在指定节点node1后插入节点node2 */public boolean insertInto(Node<Object> node1, Node<Object> node2) {if (node1 != null && node2 != null) {// 先遍历这个链表,看看有没有等于node1Node<Object> current = head;while (current != node1) {current = current.next;if (current == null) {System.out.println("不存在节点 " + node1.toString() + ",无法插入节点 "+ node2.toString());return false;}}// 此时的current如果是最后一个节点,这调用 insertLast()方法插入到最后if (current.next == null) {insertLast(node2);size++;return true;}node2.pre = current;node2.next = current.next;current.next.pre = node2;current.next = node2;size++;return true;}return false;}/** * 删除链表前端节点 */public boolean deleteHead() {if (head.next != null) {if (head.next.next != null) {// Node<Object> current = head.next;// head.next = current.next;// current.next.pre = head;// current = null;head.next = head.next.next;head.next.pre = head;size--;return true;} else {head.next = null;size--;}}return false;}/** * 删除尾节点 */public void deleteEnd() {Node<Object> current = head;while (current.next != null) {current = current.next;}// Node<Object> pre = current.pre;// pre.next = null;// current = null;current.pre.next = null;size--;}/** * 删除指定节点 */public boolean deleteNode(Node<Object> node) {if (node != null) {Node<Object> current = head;while (current != node) {current = current.next;if (current == null) {return false;}}if (node == head.next) {return deleteHead();}// 保存与node相等的值Node<Object> acurrent = current;while (current.next != null) {current = current.next;}if (current == node) {deleteEnd();return true;}Node<Object> pre = acurrent.pre;Node<Object> next = acurrent.next;pre.next = next;next.pre = pre;acurrent = null;size--;return true;}return false;}public Node<Object> get(int index) {if (index < 0 || index >= size) {System.out.println("索引超过范围!");throw new IllegalAccessError("索引超过范围!");}Node<Object> current = head;for (int i = 0; i < size - index; i++) {current = current.next;}return current;}/** * 链表长度 */public int getSize() {return size;}/** * 正序和反序遍历遍历链表并打印 */public void display() {Node<Object> current = head.next;if (current != null) {Node<Object> tail = null;System.out.println("正序输出:");while (current != null) {System.out.println(current.toString());tail = current;current = current.next;}System.out.println("反序输出:");while (tail != head) {if (tail != null) {System.out.println(tail.toString());}tail = tail.pre;}System.out.println("链表大小:" + getSize());} else {System.out.println("链表为空!");}}@Testpublic void myTest() {TWLink twl = new TWLink();Node<Object> node1 = new Node<Object>("AAA");Node<Object> node2 = new Node<Object>("BBB");Node<Object> node3 = new Node<Object>("CCC");Node<Object> node4 = new Node<Object>("DDD");twl.insertFirst(node1);twl.insertFirst(node2);twl.insertFirst(node3);twl.insertFirst(node4);twl.display();for (int i = 0; i < twl.getSize(); i++) {System.out.println(twl.get(i).toString());}}}
顺带附一张草稿图便于理解