#链表的普通删除
第一种:头部删除 head移动到下一个元素
第二种:尾部删除 倒数第二个节点指针指向null
第三种:中间删除 a前一个的指针 指向a的后一个
public class 普通删除 {
int size;
public Node remove(int index){
if(index<0||index>=size){throw new IndexOutOfBoundsException"超出范围";}
Node removeNode=null;
if(index==0){//删除头节点:head移动到下一个元素
removeNode=head;
head=head.next;//head.next指向head
if(size==1){last=null;}
}else if(index==size-1){//删除节点是末尾节点:倒数第二个next的指针指向null
Node prevNode=get(index-1);//最后一个节点的前一个节点
//prevNode.next指向要删除的节点
removeNode=prevNode.next;
//给removeNode指向为空
removeNode.next = null;
//prevNode就是现在最后一个节点了
last=prevNode;
}else {//删除中间节点
Node prevNode=get(index-1);//中间节点的前面节点
Node nextNode=prevNode.next.next;//prev下一个的下一个赋值给nextNode
//prevNode.next指向要删除的节点
prevNode.next=nextNode;
}
size--;//每次删除,链表的长度都要减
return removeNode;
}
}
删除指定数值的节点
定义pre指向头节点,cur指向头节点的下一个节点
接下来让两个指针不断向后移动,直到:
(1)cur指向的为空 or
(2)cur指向的节点为 要删除的节点
cur指向1,不需要删除【val=5】
同时指针右移,考察下一个节点:
cur指向5,与val相同,说明这个节点要删除
执行的操作:pre指向cur后面的(1直接指向9)
class Solution{
public ListNode delete(ListNode head,int val){
//链表的头节点和需要删除的相等,直接返回头节点的next指针
if(head.val==val) return head.next;
//否则的话,设置两个指针
ListNode pre=head;//指向链表的头节点
ListNode cur=head.next;//当前节点的下一个节点
//接下来让两个指针不断向后面移动:
while(cur!=null && cur.val !=val){
pre=cur;
cur=cur.next;
}
//走出来,说明要执行删除操作
pre.next=cur.next;
//最后返回链表的头节点
return head;
}
}
#根据索引删除链表
链表处理带索引的东西很麻烦(没有记序号)