《Java数据结构与算法》笔记-CH5-链表-9实现带迭代器的链表
2016-07-04 01:43
459 查看
/** * 节点类 */ class LinkNode { private long data; public LinkNode next; public LinkNode(long d) { this.data = d; } public String toString() { return String.valueOf(this.data); } } /** * 带迭代器的链表 */ class LinkListWithIterator { private LinkNode first;//链表头结点 public LinkListWithIterator() { first = null; } public LinkNode getFirst() { return first; } public void setFirst(LinkNode ln) { this.first = ln; } public boolean isEmpty() { return first == null; } /** * 得到迭代器 * @return */ public ListIterator getIter() { return new ListIterator(this); } @Override public String toString() { if (isEmpty()) return "[]"; StringBuilder sb = new StringBuilder(); sb.append("["); LinkNode current = first; while (current != null) { sb.append(current.toString()).append(","); current = current.next; } sb.deleteCharAt(sb.length() - 1); sb.append("]"); return sb.toString(); } } /** * 迭代器 */ class ListIterator { private LinkListWithIterator ourList; private LinkNode previous; private LinkNode current; /** * 初始化时传入相应的链表 * @param list */ public ListIterator(LinkListWithIterator list) { this.ourList = list; reset(); } /** * 重置迭代器 */ public void reset() { current = ourList.getFirst(); previous = null; } /** * 判断迭代器是否到了链表末尾 * @return */ public boolean atEnd() { return current.next == null; } /** * 迭代器指针向下移动 */ public void nextLink() { previous = current; current = current.next; } /** * 获取迭代器当前节点 * @return */ public LinkNode getCurrent() { return current; } /** * 从迭代器当前current处向后面插入新节点 * @param node */ public void insertAfter(LinkNode node) { if (ourList.isEmpty()) { ourList.setFirst(node); current = node; } else { node.next = current.next; current.next = node; nextLink(); } } /** * 从迭代器当前current处向前面插入新节点 * @param node */ public void insertBefore(LinkNode node) { if (previous == null) { node.next = ourList.getFirst(); ourList.setFirst(node); reset(); } else { node.next = previous.next; previous.next = node; current = node; } } /** * 删除迭代器当前节点 * @return */ public LinkNode deleteCurrent() { LinkNode temp = current; if (previous == null) { ourList.setFirst(current.next); reset(); } else { previous.next = current.next; if (atEnd()) reset(); else current = current.next; } return temp; } } public class IteratorDemo { public static void main(String[] args) { LinkListWithIterator list = new LinkListWithIterator(); ListIterator it = new ListIterator(list); for (int i = 0; i < 6; i++) { long rand = (long) (Math.random() * 100); LinkNode node = new LinkNode(rand); System.out.print("生成节点:" + node.toString() + ","); if (i % 2 == 0) { System.out.print("当前current为:" + it.getCurrent()); it.insertBefore(node); System.out.println(",执行insertBefore:" + list.toString()); } else { System.out.print("当前current为:" + it.getCurrent()); it.insertAfter(node); System.out.println(",执行insertafter:" + list.toString()); } } System.out.println("list最终为:" + list.toString()); System.out.println("current节点为" + it.getCurrent() + ",删除节点" + it.deleteCurrent() + ",结果为:" + list.toString()); System.out.println("此时current为:" + it.getCurrent()); it.reset(); System.out.println("重置后current为:" + it.getCurrent()); while (!list.isEmpty()) { System.out.println("删除current:" + it.deleteCurrent() + ",结果为:" + list.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播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树