顺序表的问题及思考:
- 顺序表中间/头部的插入删除,时间复杂度为O(N)
- 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
- 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间
思考: 如何解决以上问题呢?下面给出了链表的结构来看看
一、链表
1.1、链表的概念及结构
链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的
1.1.1、创建一个类表示节点 - ListNode
//NodeList 表示节点 类
class ListNode{
//值域
public int val;
//下一个节点的地址
public ListNode next;
public ListNode(int val){
this.val = val;
}
}
1.1.2、创建一个类来表示链表 - MyLinkedList
//ListNode 表示节点 类
class ListNode{
//值域
public int val;
//下一个节点的地址
public ListNode next;
public ListNode(int val){
this.val = val;
}
}
public class MyLinkedList {
public static void main(String[] args) {
//当new 一个节点的时候就是创建一个节点,值为 1
ListNode nodeList = new ListNode(1);
}
}
new 一个节点
如和创建多个节点,让这些节点串起来
首先要有一个头结点
单向,带头,不循环的单链表
理解链表中: 带头、不带头、单向、双向、循环、不循环的意思
带头 和 不带头
循环 和 不循环
单向 和 双向
1.1.3、模拟实现 单向 不带头 非循环的链表
用过列举的方式,创建几个节点,然后将他们连接起来
//ListNode 表示节点 类
class ListNode{
//值域
public int val;
//下一个节点的地址
public ListNode next;
public ListNode(int val){
this.val = val;
}
}
public class MyLinkedList {
public ListNode head;
//创建5个节点的链表
public void creatList(){
//当new 一