《Java数据结构与算法》笔记-CH5-链表-8实现双链表,头部和尾部插入和删除
2016-07-03 11:47
399 查看
/** * 双向链表节点类 */ class DoubleLinkNode { public long data;// 数据 public DoubleLinkNode next;// next指针 public DoubleLinkNode previous;// previous指针 public DoubleLinkNode(long d) { this.data = d; } public String toString() { return String.valueOf(data); } } /** * 双向链表 */ class DoubleLinkList { private int size; private DoubleLinkNode first;// 头节点 private DoubleLinkNode last;// 尾节点 public DoubleLinkList() { this.size = 0; this.first = null; this.last = null; } @Override public String toString() { if(isEmpty()) return "[]"; StringBuilder sb = new StringBuilder(); sb.append("["); DoubleLinkNode current = first; for(int i=0;i<size; i++){ sb.append(current.toString()).append(","); current = current.next; } sb.deleteCharAt(sb.length()-1); sb.append("]"); return sb.toString(); } public boolean isEmpty() { return first == null; } // 在链表头部插入节点 public void insertFirst(DoubleLinkNode d) { if (isEmpty())// 如果链表为空,尾节点指向新节点 last = d; else// 不空的话,头节点的previous指针指向新节点 first.previous = d; d.next = first;// 新节点的next指针指向头结点 first = d;// 头结点指向新节点 size += 1; } // 在尾部插入节点 public void insertLast(DoubleLinkNode d) { if (isEmpty())// 如果链表为空,头结点指向新节点 first = d; else {// 如果不为空,尾节点的next指针指向新节点,新节点的previous指针指向原尾节点 last.next = d; d.previous = last; } last = d;// 尾节点指向新节点 size += 1; } // 从头部删除节点 public DoubleLinkNode deleteFirst() { DoubleLinkNode temp = first;// 先将头部节点存放到temp变量中 if (first.next == null)// 如果头结点的next指针为空,也就是链表为空 last = null;// 尾节点置空 else// 如果链表不为空 first.next.previous = null;// 头结点next指向的节点的previous指向空 first = first.next;// 头结点指向原头结点的next指向的节点 size -= 1; return temp;// 返回存下来的temp节点 } // 从尾部删除节点 public DoubleLinkNode deleteLast() { DoubleLinkNode temp = last; if (first.next == null) first = null; else last.previous.next = null; last = last.previous; size -= 1; return temp; } /** * 通过key值找到节点,在后面插入新节点 * @param key * @param d * @return */ public boolean insertAfter(long key, DoubleLinkNode d) { DoubleLinkNode current = first; //找到key对应的节点,找不到返回false while (current.data != key) { current = current.next; if (current == null) return false; } //找到的节点是最后一个节点,就在尾部插入 if (current == last) { d.next = null;//新节点的next置空 last = d;//原尾节点指向新节点 } else {//找到的节点不是尾节点节点 d.next = current.next; current.next.previous = d; } d.next.previous = current; current.next = d; size += 1; return true; } } public class DoublyLinkedDemo { public static void main(String[] args) { DoubleLinkList dll = new DoubleLinkList(); for(int i=0; i<5; i++){ long l = (long)(Math.random()*1000); DoubleLinkNode node = new DoubleLinkNode(l); System.out.print("生成随机节点:"+node.toString()); dll.insertFirst(node); System.out.println(",从头部插入,此时链表为"+dll.toString()); } while(!dll.isEmpty()){ System.out.println("删除头结点:" + dll.deleteFirst()+",此时链表为:"+dll.toString()); } for(int i=0; i<5; i++){ long l = (long)(Math.random()*1000); DoubleLinkNode node = new DoubleLinkNode(l); System.out.print("生成随机节点:"+node.toString()); dll.insertLast(node); System.out.println(",从尾部插入,此时链表为"+dll.toString()); } while(!dll.isEmpty()){ System.out.println("删除尾结点:" + dll.deleteLast()+",此时链表为:"+dll.toString()); } } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树