目录
一、链表
理解:链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。
不像数组,相令邻的两个元素不仅逻辑上连续,物理上也连续。
可以把链表类比成火车,每一列火车由若干个车厢组成,每个车厢就是一个Node结点,由多个Node对象组成的大实体就是链表对象。火车的不同车厢之间,都是通过一个挂钩连接的,当这两个这厢脱钩后,这两个车厢就没有任何关系了。
二、单向链表
每个节点只保存了下一个节点的地址,只能从头节点开始向后遍历,这种链表结构称为单向链表简称单链表。
1.链表定义节点
class Node{
//存放结点的值
int val;
//存放下一结点地址
Node next;
public Node(int val) {
this.val = val;
}
public Node(int val, Node next) {
this.val = val;
this.next = next;
}
}
2.不带头的单链表的创建
public class SingleLinedList {
//链表的头结点
private Node head=null;
//当前链表中Node节点的个数 = 有效数值的个数
private int size=0;
class Node{
//存放结点的值
int val;
//存放下一结点地址
Node next;
public Node(int val) {
this.val = val;
}
public Node(int val, Node next) {
this.val = val;
this.next = next;
}
}
}
单链表的遍历
public String toString(){
//遍历链表
String ret="";
Node x=head;
while (x!=null){
ret+=x.val;
ret+="->";
x=x.next;
}
ret+="Null";
return ret;
}
从当前头节点开始,依次取出每个节点值,然后通过next引用走到下一个节点,直到走到链表的末尾(next = null)
遍历过程中,能否直接使用head引用?直接使用head引用,遍历一次链表之后,链表就丢了~~
三、单链表的增删查改
我们只需要调用单链表提供的增删改查方法即可,至于链表内部节点如何连接的,如何遍历的都不关心。
一、单链表的增加
1.头插
public void addFirst(int val){
Node newNode=new Node(val);
newNode.next = head; // 直接将该结点node变成新的头结点
head = newNode;
size++;
}
2.下标插入
public void addIndex(int index,int val) {
// 1.若index位置非法的
if(index<0 || index>size){
System.out