目录
一、虚拟头节点
dummyHead——只作为链表的头节点使用,不存储有效数据,链表中的其他节点我都可以一视同仁,每个节点都有前驱节点
二、单链表——增
1、在链表的头部插入val
public void addFirst(int val)
/**
* 单链表的头插
* @param val
*/
public void addFirst(int val){
Node node=new Node();
node.val=val;
node.next=dummyHead.next;
dummyHead.next=node;
// Node node=new Node(val,dummyHead.next); //此处利用构造方法简化代码
// dummyHead.next=node;
// dummyHead.next=new Node(val,dummyHead.next);此处使用匿名对象简化代码
size++;
}
2、在索引为index的位置插入值为val的节点
public void add(int index,int val)
/**
* 在索引为index的位置插入值为val的节点
* @param index
* @param val
*/
public void add(int index,int val){
if (index<0||index>index){
System.err.println("index不在范围内");
return;
}
Node prev=dummyHead;
for (int i = 0; i <index ; i++) {
prev=prev.next;
}
//prev就是待插入元素的前驱
// Node node=new Node();
// node.val=val;
// node.next=prev.next;
// prev.next=node;
Node node=new Node(val,prev.next);
prev.next=node; //使用构造方法在产生新节点的同时给node赋值以及连接后继节点
size++;
}
三、单链表——删除
1、删除单链表中索引为index的节点,返回删除前的节点值
public int remove(int index)
/**
* 删除单链表中索引为index的节点,返回删除前的节点值
* @param index
*/
public int remove(int index){
if (rangCheck(index)){
Node prev=dummyHead;
for (int i = 0; i <index; i++) {
prev=prev.next;
}
Node node=prev.next;
prev.next=node.next;
int val=node.val;
node.next=null;
size--;
return val;
}
System.err.println("index不在范围没");
return-1;
}
2、删除链表中所有值为val的元素
public void removeAllVal(int val)
当存在虚拟节点时,就不需要考虑头节点,prev是从dummyHead开始向后进行判断的,其他的逻辑和单链表的删除逻辑是一样的
/**
* 删除链表中的所有值为val的元素
*/
public void removeAllVal(int val){
Node prev=dummyHead;
while(prev.next!=null){
//保证有后继节点
if (prev.next.val==val){
//此时prev.next就是待删除的值
prev.next=prev.next.next;
size--;
}else{
//此时prev.next.val!=val,才可以移动prev
prev=prev.next;
}
}
}