1.为什么要使用链表
动态数组有个明显的缺点:可能会造成内存空间的大量浪费
那么能否用到多少就申请多少内存:链表可以办到这一点
2.链表的设计
需要两部分,一部分是存放数据、另外一部分是指向下一节点位置的指针
3.接口设计
链表的大部分接口和动态数组是一致的
清空元素 – clear()
public void clear() {
size = 0;
first = null;
last = null;
}
index为要添加的位置
添加元素 - add(int index, E element)
public void add( int index, E element) {
rangeCheck (index );
if (index == 0) {
first = new Node<>(element, first) ;}else i
Node<E>prev = node(index - 1);
prev.next = new Node<>(element, prev.next);
}
size++;
}
删除元素 - remove(int index)
index为删除哪个位置的元素
public Eremove( int index) {
rangeCheck(index) ;
Node<E> node = first;if ( index == ) {
first = first.next;}else i
Node<E> prev = node( index - 1);node = prev.next;
prev.next = node.next;
}
size--;
return node.element;
}
4.双向链表
使用双向链表可以提升链表的综合性能
双向列表需要三部分组成,比链表多一个部分为指向前一个结点的指针
5.双向链表的接口变化
双向链表 – add(int index, E element)
public void add( int index, E element) i
rangecheckForAdd(index);
if (index == size) {
Node<E> oldLast = last;
last = new Node<>(oldLast, element, nul1);if (oldLast == null) {
first = last;
}else {
oldLast.next = last;
}else i
Node<E> next = node( index) ;Node<E> prev = next.prev;
Node<E> current = new Node<>(prev, element, next);next.prev = current;
if (prev == nu11) {
first = current;}else {
prev.next =current;
}
}
size++;
}
双向链表 – remove(int index)
public Eremove(int index) {
rangeCheck(index ) ;
Node<E> node = node(index) ;Node<E> prev = node. prev;Node<E> next = node.next;
if (prev == nul1) i
first = next;}else i
prev.next = next;
}
if (next == nul1) {i
last = prev;}else i
next.prev = prev;
}
size--;
return node.element;
}
6单向循环链表
单向循环链表 – add(int index, E element)
public void add( int index, E element) {
rangeCheckForAdd(index);
if (index == ) {
Node<E> newFirst = new Nodec>(element, first);TNode<E> last = (size == 0) ?newFirst : node(size - 1);last.next = newFirst;
first = newFirst;
} else {
Node<E> prev = node(index - 1);
prev.next = new Node<>(element, prev.next);
}
size++;
}
单向循环链表 – remove(int index)
public E remove( int index) {
rangeCheck( index);
Node<E> node = first;
if (index == ) {
if (size ==1) {
first = null;
else {
Node<E> last = node(size - 1);
first = first.next;
last.next = first;
}
}else {
Node<E> previous = node( index - 1);
node = previous.next;
previous.next = node.next;
}
size--;
return node.element;
}
7.双向循环链表
双向循环链表 – add(int index, E element)
public void add( int index, E element) {
rangeCheckForAdd( index );
if (index == size) i
Node<E> oldLast = last;
last = new Node<>(oldLast, element,first);
if (oldLast == nul1){
first = last;
first.next = first;first.prev = first;
}else {
oldLast.next = last;first.prev = last;
}
}else {
Node<E> next = node( index);Node<E> prev = next.prev;
Node<E> current = new Node<>(prev,element,next);next.prev = current;
prev.next = current;
if (next == first) {
first = current;
}
}
size++;
}