数组在内存中的存储是连续的。
链表在内存中的存储不一定是连续的。
链表存储数据时分为数据域和地址域,数据域负责存储这里的数据,地址域存储的是该链表中下一个元素的地址。
链表的构建过程:
public class Node{
int data; //数据
Node next; //下一个节点的位置
public Node(int data) { //构造函数,给data赋值
this.data = data;
}
}
public class test{
public static void main(String[] args) {
Node node = new Node(5);
Node node1 = new Node(7);
node.next = node1;
}
}
结果:5 7
底层逻辑:
缺点:这样的单链表不容易进行维护和管理。
针对这个缺点我们要写一个管理类。
优化之后的节点类和管理类:
public class ListNode {
public int value; // 数据域
public ListNode next; // 下一个节点的地址域
public ListNode(int value){
this.value = value;
}
}
public class LinkList {
ListNode head = null;
}
在另一个类里写出主方法:
public class demo {
public static void main(String[] args) {
LinkList linkList = new LinkList();
}
}
尝试创建一个链表,并插入数据
public void insert(int value){
ListNode listNode = new ListNode(value); //将value值输入到ListNode中
if (head == null){
head = listNode; //将listNode的地址赋给head
return;
}
ListNode tempNode = head; //创建指针,默认指向head
while (tempNode.next != null){ //遍历链表中元素直至找到地址为空的元素
tempNode = tempNode.next;
}
tempNode.next = listNode; //将下一个元素的地址赋给当前空值
}
以此为基础写出其他方法:
//尾插法
public void tailinsert(int value) {
ListNode listnode = new ListNode(value);
if (tail == null){
tail = listnode;
return;
}
ListNode tempNode = head;
while(tempNode.next != null) {
tempNode = tempNode.next;
}
tempNode.next = listnode;
tempNode = listnode;
}
// 头插法
public void HeadAdd(int value){
ListNode listNode = new ListNode(value);
listNode.next = head;
head = listNode;
}
// 输出链表的值
public void printLink(){
//定义右边指向链表当中的第一个节点
ListNode tempNode = head;
while (tempNode !=null){
System.out.println(tempNode.value);
tempNode = tempNode.next;
}
}
/// 输出当前链表的长度
public void getLength(){
if (head ==null){
return;
}
ListNode tempNode = head;
int count = 0;
while (tempNode !=null){
count ++;
tempNode = tempNode.next;
}
System.out.println(count);
}