链表:自定义双链表总结
来源:互联网 发布:张清安 知乎 编辑:程序博客网 时间:2024/04/29 23:46
双链表每个节点都有两个链prev和 next,所以相对于单链表在某些功能的实现上更简单一些。
Java实现
import java.util.Iterator;import java.util.NoSuchElementException;public class DoubleLinkedList<Item> implements Iterable<Item> { private class Node { private Item item; private Node prev; private Node next; } private Node first; private Node last; private int N; public DoubleLinkedList() { first = null; last = null; } public DoubleLinkedList(Item[] a) { for (Item i : a) append(i); } public DoubleLinkedList(Iterable<Item> coll) { for (Item i : coll) append(i); } public int size() { return N; } public boolean isEmpty() { return size() == 0; } /** * 返回头尾节点元素 * * @return */ public Item first() { if (isEmpty()) throw new RuntimeException("链表为空"); return first.item; } public Item last() { if (isEmpty()) throw new RuntimeException("链表为空"); return last.item; } /** * 获取k位置的节点 */ public Node node(int k) { Node curr = null; int i = 1; if (k > 0) { curr = first; while (i < k && curr != null) { curr = curr.next; i++; } } else if (k < 0) { k = -k; curr = first; while (i < k && curr != null) { curr = curr.prev; i++; } } return curr; } /** * 头增 */ public void prepend(Item item) { Node x = new Node(); x.item = item; if (isEmpty()) { first = x; last = x; } else { x.next = first; first.prev = x; first = x; } N++; } /** * 尾增 */ public void append(Item item) { Node x = new Node(); x.item = item; if (isEmpty()) { first = x; last = x; } else { x.prev = last; last.next = x; last = x; N++; } } /** * 前插 */ public void insertBefore(Node node, Item item) { if (node == first) prepend(item); else { Node prev = node.prev; Node x = new Node(); x.item = item; x.prev = prev; x.next = node; prev.next = x; node.prev = x; N++; } } /** * 后插 */ public void insertAfter(Node node, Item item) { if (node == last) append(item); else { Node next = node.next; Node x = new Node(); x.item = item; x.prev = node; x.next = next; node.next = x; next.prev = x; N++; } } /** * 删除第一个元素 */ public Item removeFirst() { if (isEmpty()) throw new RuntimeException("表为空"); Item item = first.item; if (first.next != null) first.next.prev = null; first = first.next; N--; if (first == null) last = null; // 避免游离 return item; } /** * 删除最后一个元素 */ public Item removeLast() { if (isEmpty()) throw new RuntimeException("表为空"); Item item = last.item; if (last.prev != null) last.prev.next = null; last = last.prev; N--; if (last == null) first = null; return item; } /** * 删除某个节点 */ public Item remove(Node node) { if (node == first) return removeFirst(); else if (node == last) return removeLast(); else { Node prev = node.prev; Node next = node.next; prev.next = node.next; next.prev = node.prev; N--; return node.item; } } /** * 迭代器 */ @Override public Iterator<Item> iterator() { return new ListIterator(); } private class ListIterator implements Iterator<Item>{ private Node current = first; @Override public boolean hasNext() { return current != null; } @Override public Item next() { if(!hasNext()) throw new NoSuchElementException(); Item item = current.item; current = current.next; return item; } @Override public void remove() { throw new UnsupportedOperationException(); } }}
0 0
- 链表:自定义双链表总结
- 链表:自定义单链表总结
- 总结:发送自定义消息
- 总结:发送自定义消息
- 总结:发送自定义消息
- 总结:发送自定义消息
- 自定义泛型总结
- 自定义标签开发总结
- 自定义generator 总结
- 自定义事件、组件总结
- 自定义标签总结
- 自定义事件总结
- smarty自定义函数总结
- SMARTY自定义函数总结
- FLEX:自定义事件 总结
- FLEX:自定义事件总结
- 自定义view总结一
- 自定义对话框的总结
- AOJ-776 马的走法 动态规划
- 银联支付的接口申请
- C++重载练习
- 百度地图定位js
- 通过 Java 去监测某个目录下的文件变动
- 链表:自定义双链表总结
- 5-9 红色警报 (25分)
- 【TI】TI无线连接文档快速查找链接
- 创建第一个Servlet
- Javascript权威指南看书笔记
- 2017_NJCTF_Misc_easycrypto
- HTTP1.1与HTTP1.0的区别
- 字符串基本操作
- 2013第四届蓝桥杯预赛试题本科c++马虎的算式