这里写目录标题
写链表的时候,必须保证引用不为空引用。像cur.next!=null,这种代码得保证cur不为空。
1 链表插入
1.1 不带傀儡结点的插入
1.1.1 插入到链表的中间位置
注:(只变化next存放的地址 需要找到待插入节点前一个位置)
例如:把100这个节点插入到1和2之间
把100这个节点插入到1和2之间,此时需要先知道1(待插入位置的前一个节点)这个节点的引用
- 定义一个prev引用,里面存放1的地址
Node pre=new Node(1); - 定义一个cur引用,里面存放新节点的地址
Node cur=new Node(100);
关键代码:
1.先修改cur.的指向,让cur指向2(即cur.next存放2的地址)
cur.next=prev.next;
2.pre 指向cur(pre的next存放cur的地址)
prev.next=cur;
1.1.2 头节点插入(插入到链表的头结点,使之为头结点)
注:头结点插入会影响head指向,之前的插入中间位置,需要找到待插入位置的前一个位置。但是头插前面没有位置
关键代码:
1.先让cur的next指向head
cur.next=head;
2.再让head指向新节点
head=cur;
1.3 尾插和中间插的(插入)关键代码相同(要找到末尾结点)
思路:先找到末尾结点,然后进行插入
public static void insertTail(Node head,int val){
if (head==null){
return ;
}
//先找到最后一个结点的位置
Node prev=head;
while(prev.next!=null){
prev=prev.next;
}
//此时prev指的是最后一个元素
//定义一个带插入的节点
Node cur=new Node(10);
cur.next=prev.next;
prev.next=cur;
}
1.2 带傀儡结点的插入
注:不带傀儡结点的链表,插入中间位置和插入头部是两种不同的代码。
带傀儡结点插入把两个操作统一。
此时的头插也相当于中间插.
1.2.1 中间插(要找到待插入结点前一个结点的位置)
public class Main {
public static void main(String[] args) {
Node head= createListWithDummy();
//找到待插入前一个位置
Node prev=head.next;
//创建带插入的节点
Node cur=new Node(10);
//中间插的步骤
//往中间结点插入,1和2之间
cur.next=prev.next;
prev.next=cur;
}
//带傀儡结点链表
//傀儡借点中的值不使用