今天主题是单链表
前文已经介绍了关于线性结构的顺序存储结构实现,本文主要是关于线性结构的链式存储结构实现。
链式存储结构是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的。相比顺序结构,链式存储结构更依赖于数据元素之间的关系。你可以在任意位置放置你的数据元素,但是你要保证正常指向它的下一个元素
1.链表的结点
一个链表需要有结点,包括元素,以及下一个结点的信息
注意:链表的起点并不是第一个结点,而是头指针,头指针不存储元素,但是可以存储线性表的长度等公共元素
2.链表的读取
链表的读取,需要从第一个结点开始,若无查找到数据则移动到下一个结点,直到找到需要数据。
3.链表的插入
比如我我们需要在1和3直接插入2这个数据元素,则需要改变他们的前后关系,如图
插入前
插入后
4.链表的删除
删除与插入同理,需要改变对应关系
删除前
删除后
在实际操作中,删除后应当销毁对象,在java里面可交由jvm自动回收
下面是实现过程,
首先创建结点类
public class Node {
Object element;
Node next;
public Node(Node nextval) {
// TODO Auto-generated constructor stub
next = nextval;
}
public Node(Node nextval,Object object) {
// TODO Auto-generated constructor stub
next = nextval;
element = object;
}
public Object getElement() {
return element;
}
public void setElement(Object element) {
this.element = element;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
@Override
public String toString() {
return element.toString();
}
}
然后是链表
public class LinkList {
Node head;
Node current;
int size;
LinkList(){
head = current =new Node(null);
size =0;
}
public Object getElem(int i){
Node p = head;
int j = 1;
while (j<i+1) {
p = p.next;
++j;
//System.out.println(p.element);
}
if(p==null||j>i+1) return null;
return p.element;
}
public boolean insert(int i ,Object e){
Node p = head;
int j = 1;
while (j<i) {
p = p.next;
++j;
}
if(p==null||j>i) return false;
Node s = new Node(null);
s.element = e;
s.next = p.next;
p.next = s;
size++;
return true;
}
public boolean delete(int i ){
Node p = head;
int j = 1;
while (j<i) {
p = p.next;
++j;
}
if(p==null||j>i) return false;
p.next = p.next.next;
size--;
return true;
}
public void showall(){
Node p = head;
while (p.next!=null) {
p = p.next;
System.out.print(p.element+" ");
}
System.out.println();
}
}
进行测试
public class test {
public static void main(String[] args) throws Exception {
LinkList list = new LinkList();
System.out.println(list.insert(1, 44));
System.out.println(list.insert(2, 42));
list.showall();
System.out.println(list.delete(1));
System.out.println(list.getElem(1));
list.showall();
}
}
那么什么情况下需要使用顺序线性表,什么情况下使用链表呢?
如果数据需要频繁查找,那么需要使用顺序线性表
如果需要频繁插入删除,建议使用链表
当元素个数未知时,推荐使用链表。