之前写过一次单链表的实现,但是后续翻看的时候觉得描述的不是特别好,就翻了下源码,重新整理了一下,bty:看源码真实天了噜,太神奇了。
——————————————————————————————————————————————————————————————————————
1. 程序实现功能
<span style="font-size:14px;"> public void add(E data) //添加元素
public void add(int index,E element)//在指定的索引处添加元素
public Node<E> get(int index)//获得某个节点
public E remove(int index)//删除指定位置元素,返回删除的元素 </span>
2. 抽象节点类
<span style="font-size:14px;"> class Node<E> {
E item;
Node<E> next;
Node( E element, Node<E> next) {
this.item = element;
this.next = next;
}
} </span>
由数据元素和下一个结点的地址构成
3.LinkedList类实现
类中有三个private成员以及默认构造函数,分别为
<span style="font-size:14px;"> private Node<E> first;//头节点
private Node<E> last;//尾节点
private int size = 0;//大小
public LinkedList() {
}</span>
辅助方法:向链表头尾添加元素以及边界判断抛异常
<span style="font-size:14px;">//向链表末尾添加元素
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>( e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
}
//向链表头部添加元素
void linkBefore(E e, int index) {
Node<E> prev = null;
final Node<E> newNode = new Node<>( e, get(index));
if(index==0){
first = newNode;
}else{
prev = get(index-1);
prev.next=newNode;
}
size++;
}
private String outOfBoundsMsg(int index) {
return "Index: " + index + ", Size: " + size;
}
private void checkPositionIndex(int index) {
if (!isPositionIndex(index))
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
private boolean isPositionIndex(int index) {
return index >= 0 && index <= size;
}</span>
核心方法
<span style="font-size:14px;">/* 添加元素即向链表尾追加元素,需判断是否超出已有索引值 */
public void add(E data) {
linkLast(data);
}
/*在指定的索引处添加元素*/
/*添加处刚好为最后一个,即=add()添加至末尾*/
/*添加到某元素之前*/
public void add(int index,E element){
checkPositionIndex(index);
if (index == size)
linkLast(element);
else
linkBefore(element, index);
}
/* 获得某个节点 */
public Node<E> get(int index) {
checkPositionIndex(index);
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
}
/* 删除指定位置元素,返回删除的元素 */
/*需判断是否头结点*/
/*不是头结点则需要根据当前结点的前一个结点及后续结点进行操作*/
public E remove(int index) {
Node<E> x = get(index);
E element = x.item;
Node<E> next = x.next;
Node<E> prev = null;
if(index==0){
first = next;
}
else{
prev = get(index-1);
prev.next=next;
}
x.item = null;
size--;
return element;
}
public int size(){
return size;
}</span>
至此,链表线性存储已经完成。