访问Access O(N)
搜索 O(N) 不知道内存地址
插入 O(1)
内存中随便找一个位置,插入数,断开插入位置上一个数的next指针,把上一个数的next指针指向插入的数,把插入数的next指针指到下一个下一个数
删除 O(1)
把上一个数的next指针断开,把要删除的数的next指针断开,把上一个的数的next指针直接指向下一个的数
链表数据结构的读很慢,写很快
链表的常见操作
1.创建链表
LinkedList<Interger> List = new LinkedList<>();
2.添加元素
list.add(1); list.add(2);
链表尾端依次次插入
list.add(2,99);
//在2位置插入99 O(1)因为找到索引为2的位置需要从头到尾找
3.访问元素
list.get(2);
4.搜索元素
int index=list.indexOf(99);
//搜索链表中元素为99的位置 O(N)
5.更新元素
list.set(2,88);
把第二个位置的值变成88
6.删除元素
list.remove(2);
//把第二个元素的位置删除 O(n) 原因是从头到尾遍历找到索引为2的位置
7.长度
list.size();
203题
设置一个dummy指针,dummy.next=head,这样就算head移动遍历的时候,也有指针可以代替头指针,
设置一个prev指针作为head的前一个,prev.next=dummy,这是最开始的地址,prev的next始终是head,
while(head!=null){
if(head.val==val){
prev.next=head.next;
head=head.next;
}
else{
prev=head;
head=head.next;
}
}
当head不为空的时候,依次遍历搜索,当链表中的值和val值相等的时候,prev.next直接指向val的next head也往后移,这样就删除了链表中的val
当遍历到不与val相等的值的时候,为了不改变链表结构,prev的指向改变,head指针往后移,继续遍历