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());}}}顺带附一张草稿图便于理解
- Java双向队列,用双向链表实现的
- java实现双向链表的操作
- Java双向链表的实现
- 双向链表的Java实现
- Java双向链表的实现
- java中双向链表的实现
- java的双向链表简单实现
- 双向链表的java实现
- Java双向链表的实现
- JAVA实现双向链表
- JAVA实现双向链表
- Java实现双向链表
- JAVA实现双向链表
- JAVA实现双向链表
- JAVA实现双向链表
- 【java】双向链表实现
- Java双向链表实现
- 双向链表 --java实现
- 临界区CriticalSection 的安全使用
- jQuery 表格插件
- 不错的技术博文网址(不定期更新)
- 判断一个数是否有重复数字
- hdu oj 2024
- Java双向链表的实现
- 用 ChartJS 创建动态仪表盘
- 2008导入excel
- std::auto_ptr 官网例子
- 使用360极速(360Chrome双核)浏览器,360邮件通初始化失败的解决方法
- 64 位下 jmp 指令 Intel 与 AMD 的实现
- The best way to delete code
- 强大的dmp文件
- 庞果网回文数问题ruby解答