您的位置:首页 > 理论基础 > 数据结构算法

数据结构1——线性表链式存储 java

2016-06-25 09:23 513 查看
之前写过一次单链表的实现,但是后续翻看的时候觉得描述的不是特别好,就翻了下源码,重新整理了一下,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>
至此,链表线性存储已经完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: