实现线性表的另一种常用技术是基于链接结构,用链接关系显式地表现元素之间的顺序关联
采用链接方式实现线性表的基本想法:
- 把表中元素分别存入一批独立的存储块(称为表的结点)里;
- 在前一结点里用链接的方式显式地记录与下一结点的关联,保证从组成表结构的任一结点都可以找到下一个结点,从而保证能找到表中的下一个元素
单链表结点的结构:
表元素域elem保存着作为一个表元素的数据项,链接域next里保存着同一个表里的下一个结点的链接
单链表结点的实现:
class Node {
int elem;
Node next;
public Node(int elem) {
this.elem = elem;
}
}
常见形式的单链表:
n个结点通过链接形成一条链接链,head变量用于保存表首结点的引用,称为表头变量或者表头指针,表尾结点的链接域置为空(null),用于表示链表的结束
简单实现一个单链表:
class SingleLinkedList {
Node head;
int size;
public SingleLinkedList() { }
private void checkRange(int i) {
if(i<0 || i>=size) {
throw new IndexOutOfBoundsException("Index:"+i+" Size:"+size);
}
}
public boolean isEmpty() {
return head==null;
}
public void prepend(int elem) {
Node newNode = new Node(elem);
size++;
if(head==null) {
head = newNode;
return;
}
newNode.next = head;
head = newNode;
}
public void append(int elem) {
insert(elem, size);
}
public void insert(int elem, int i) {
if(i<0 || i>size) {
throw new IndexOutOfBoundsException("Index:"+i+" Size:"+size);
}
if(i==0) {
prepend(elem);
return;
}
Node newNode = new Node(elem);
Node currNode = head;
while(i!=1) {
currNode = currNode.next;
i--;
}
newNode.next = currNode.next;
currNode.next = newNode;
size++;
}
public void deleteFirst() {
if(head == null) {
throw new IndexOutOfBoundsException("Index:"+0+" Size:"+0);
}
head = head.next;
size--;
}
public void deleteLast() {
delete(size-1);
}
public void delete(int i) {
checkRange(i);
if(i==0) {
deleteFirst();
return;
}
Node currNode = head;
while(i!=1) {
currNode = currNode.next;
i--;
}
currNode.next = currNode.next.next;
size--;
}
public int get(int i) {
checkRange(i);
Node currNode = head;
while(i!=0) {
currNode = currNode.next;
i--;
}
return currNode.elem;
}
public int length() {
return size;
}
public int find(int elem) {
Node currNode = head;
int i = 0;
while(currNode!=null) {
if(currNode.elem==elem) {
return i;
}
i++;
currNode = currNode.next;
}
return -1;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append('[');
Node currNode = head;
while(currNode!=null) {
sb.append(currNode.elem);
currNode = currNode.next;
if(currNode!=null) {
sb.append(',');
}
}
sb.append(']');
return sb.toString();
}
}