定义:数据结构是对在计算机内存中的数据的一种安排,也可以理解为对计算机机运算的数据单元的一个抽象。
1.集合结构 2.线性结构 3.树形结构 4.图形结构 线性机构分为:
1,顺序存储结构。2,链式存储结构List就是顺序存储结构
•优点: 尾插效率高,支持随机访问。 •缺点: 中间插入或者删除效率低。 •应用: ArrayList2.
链式存储分为:单链,跟双链,Message消息队列
3.双链,Linkedlist代码:手写
public class LinkedList<E> {
Node<E> first;
Node<E> last;
int size;
public LinkedList() {
}
public void add (E e) {
linkLast(e);
}
/**
* 在index 的位置添加一个元素
* @param index
* @param e
*/
public void add (int index, E e) {
if(index < 0 || index >size) {
return;
}
if (index == size) {
linkLast(e);
} else {
Node<E> target = node(index);
Node<E> pre = target.prev;
Node<E> newNode = new Node<E>(pre, e, target);
//有坑
// pre.next = newNode;
// pre = newNode;
if(pre == null) {
first = newNode;
} else {
pre.next = newNode;
}
pre = newNode;
size++;
}
}
public E get(int index) {
if(index < 0 || index >size) {
return null;
}
return node(index).item;
}
/**
* 删除index 的元素
* @param index
*/
public void remove(int index){
Node<E> target = node(index);
unlinkNode(target);
}
private void unlinkNode(Node<E> p) {
//有坑
// p.prev.next = p.next;
// p.next.prev = p.prev;
Node<E> pre = p.prev;
Node<E> next = p.next;
//等价与删除第一个节点
if (pre == null) {
first = p.next;
} else {
pre.next = p.next;
}
//等价与删除尾节点
if (next == null) {
last = p.prev;
} else {
next.prev = p.prev;
}
size--;
}
private Node<E> node(int index) {
//index 处于前半部分
if (index < (size>>1)) {
Node<E> node = first;
for(int i = 0; i < index; i++) {
node = node.next;
}
return node;
} else { //index 处于后半部分
Node<E> node = last;
for(int i = size - 1; i > index; i--) {
node = node.prev;
}
return node;
}
}
private void linkLast(E e) {
Node<E> newNode = new Node<E>(last, e, null);
Node<E> l = last;
last = newNode;
if (l == null) {
first = newNode;
}else {
l.next = newNode;
}
size ++;
}
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
}