单链表:用一组任意的存储单元来存储线性表的数据单元,这组数据可以是连续的,也可以是不连续的。
单链表的数据元素构成:数据内容+下一组数据存储的位置信息。(数据域+指针域)
下图为一组简单的链表存储结构:
如图,每一组单元数据都包含数据域与指针域部分,数据域保存着当前数据单元所存储的数据信息,指针域保存着下一数据单元的地址信息,在链表遍历中可以通过指针域的信息查找下一组数据信息。
一.添加数据
如果是在链表的末尾直接添加数据,可以通过遍历链表找到链表的末尾,然后再添加新的内容,以下的内容可以找到链表的末尾:
while(node->next != null){
current = current.next;
}
如果是在指定的位置上添加新的元素,则需要调整链表中单元的位置。
例如在上图的位置中插入一个元素(node),就要用过以下的方式实现:
Node node = new Node();
node.next = left.next;(right)
left.next = node;
删除数据的原理如同上图添加数据,也是要通过调整链表位置来实现。
如果要删除上图的right元素:
left.next = right.next;
用java实现单链表的代码:
class Node{
private int data;
private Node next;
private Node head = null;
public Node(){
}
public Node(int data){
this.data = data;
}
public void init(int data){
Node node = new Node(data);
//node为链头,next为空
node.next = head;
//将node赋值给头head
head = node;
}
//在链表尾部加入数据
public void add(int data){
//要加入的数据
Node node = new Node(data);
//链头
Node current = head;
while(current.next != null){
current = current.next;
}
current.next = node;
}
public void insert(int data, int index){
int i = 0;
Node node = new Node(data);
//当前位置的结点
Node current = head;
//指定位置前的链表
Node previous = head;
//index位置后插入
while(index != i){
previous = current;
current = current.next;
i++;
}
node.next = current;
previous.next = node;
}
//删除链表index位置上的元素
public void delete(int index){
int i = 1;
Node current = head;
Node previous = head;
while(index != i){
previous = current;
current = current.next;
i++;
}
previous.next = current.next;
}
//查找index位置上的元素
public int find(int index){
int i = 1;
Node current = head;
Node previous = head;
while(index != i){
previous = current;
current = current.next;
i++;
}
return current.data;
}
public void displayAll(){
Node node = head;
while(node != null){
System.out.print(node.data+"->");
node = node.next;
}
}
}
public class LinkListDemo01 {
public static void main(String args[]){
Node node = new Node();
node.init(1);
node.insert(2, 1);
node .insert(3, 1);
node.insert(4, 1);
node.displayAll();
System.out.println();
node.add(5);
node.displayAll();
System.out.println();
node.delete(3);
node.displayAll();
System.out.println();
System.out.println(node.find(2));
}
}
运行结果:
1->4->3->2->
1->4->3->2->5->
1->4->2->5->
4