相比ArrayList,双链表的数据结构就复杂多了,想要弄清代码的意思还是要搞清数据结构层面的变化。

 package cn.sp.chapter03;

 import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.NoSuchElementException; /**
* Created by 2YSP on 2017/10/9.
* 实现自己的双链表
*/
public class MyLinkedList<AnyType> implements Iterable<AnyType> { private static class Node<AnyType> { public AnyType data;
public Node<AnyType> prev;//指向的前一个节点
public Node<AnyType> next;//指向的后一个节点 public Node(AnyType d, Node<AnyType> p, Node<AnyType> n) {
this.data = d;
this.prev = p;
this.next = n;
}
} public MyLinkedList() {
doClear();
} public void clear() {
doClear();
} private void doClear() {
beginMarker = new Node<AnyType>(null, null, null);
endMarker = new Node<AnyType>(null, beginMarker, null);
beginMarker.next = endMarker; theSize = 0;
modCount++;
} public int size() {
return theSize;
} public boolean isEmpty() {
return size() == 0;
} public boolean add(AnyType x) {
add(size(), x);
return true;
} public void add(int idx, AnyType x) {
addBefore(getNode(idx, 0, size()), x); } public AnyType get(int idx) {
return getNode(idx).data;
} public AnyType set(int idx, AnyType newVal) {
Node<AnyType> p = getNode(idx);
AnyType oldVal = p.data;
p.data = newVal;
return oldVal;
} public AnyType remove(int idx) {
return remove(getNode(idx));
} /**
* @param p 添加在该节点前
* @param x 要添加的数据
*/
private void addBefore(Node<AnyType> p, AnyType x) {
Node<AnyType> newNode = new Node<>(x, p.prev, p);
newNode.prev.next = newNode;
p.prev = newNode;
theSize++;
modCount++;
} private AnyType remove(Node<AnyType> p) {
p.prev.next = p.next;
p.next.prev = p.prev;
theSize--;
modCount++;
return p.data;
} private Node<AnyType> getNode(int idx) {
return getNode(idx, 0, size() - 1);
} private Node<AnyType> getNode(int idx, int lower, int upper) {
Node<AnyType> p; if (idx < lower || idx > upper) {
throw new IndexOutOfBoundsException();
} if (idx < size() / 2) {
p = beginMarker.next;
for (int i = 0; i < idx; i++) {
p = p.next;
} } else { p = endMarker;
for (int i = size(); i > idx; i--) {
p = p.prev;
}
} return p;
} @Override
public Iterator<AnyType> iterator() {
return new LinkedListIterator();
} private class LinkedListIterator implements java.util.Iterator<AnyType> { private Node<AnyType> current = beginMarker.next;
private int expectedModCount = modCount;
private boolean okToRemove = false; @Override
public boolean hasNext() {
return current != endMarker;
} @Override
public AnyType next() { if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
} if (!hasNext()) {
throw new NoSuchElementException();
} AnyType nextItem = current.data;
current = current.next;
okToRemove = true; return nextItem;
} @Override
public void remove() {
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
} if (!okToRemove) {
throw new IllegalStateException();
} MyLinkedList.this.remove(current.prev);
expectedModCount++;
okToRemove = false;
}
} private int theSize;
private int modCount = 0;
private Node<AnyType> beginMarker;
private Node<AnyType> endMarker;
}

最新文章

  1. read.csv 把 &quot;T&quot; 读成 &quot;TRUE&quot; 的问题
  2. 【原创】TP-LINK +ASUS(Tomato) 双无线路由设置WDS
  3. exam help
  4. QT基本使用
  5. Python3基础 assert关键字 成功啥事没有,失败了就报错
  6. Steam和Byte[]之间进行输换
  7. Macbook pro内存升级
  8. python的编码
  9. realloc 函数的使用
  10. 【Windows核心编程】Windows常见数据类型
  11. arraylist的使用
  12. C++中多重继承构造函数执行顺序
  13. python登陆教务管理系统
  14. Qt之图标切分与合并(关键是使用QPixmap的copy函数来拷贝整张图片的某个区域)
  15. Python的编码风格
  16. IDEA修改编辑背景图片
  17. 关于js中的类式继承
  18. Java技术学习之影响MySQL性能的配置参数
  19. C#运行时通过字符串实例化类对象
  20. React 与 React Native 底层共识:React 是什么

热门文章

  1. ViewPager与Fragment刷新数据
  2. MySQL注释(转)
  3. react 使用 eslint 的三种代码检查方案总结,多了解点--让代码更完美....
  4. Javascript setTimeout(0),闭包
  5. [Tools] Scroll, Zoom, and Highlight code in a mdx-deck slide presentation with Code Surfer &lt;&#127940;/&gt;
  6. kindle】扫描版PDF完美切割六寸
  7. 【C#】无损转换Image为Icon 【C#】组件发布:MessageTip,轻快型消息提示窗 【C#】给无窗口的进程发送消息 【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体 【手记】调用Process.EnterDebugMode引发异常:并非所有引用的特权或组都分配给呼叫方 【C#】DataRowState演变备忘
  8. 安装PyQt5和Eric6
  9. Hibernate基础-HelloWord
  10. Ubuntu下配置Tomcat以指定(非root)身份执行