问题描述:
当我们想要删除链表中某个元素的时候,我们需要什么办法来解决呢?
问题实现:
- 可以采用for循环正序遍历删除元素(有弊端)
- 可以采用for循环倒序遍历删除元素
- 可以采用iterator遍历进行删除
代码实现:
测试方法:
@Test
public void test(){
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(5);
delete2(list,2);
print(list);
}
打印链表方法:
public void print(List list){
Iterator iterator = list.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
}
采用for循环正序遍历的代码实现:
private void delete1(List<Integer> list, int target) {
//正序遍历删除元素的时候会出现一个问题就是在删除的过程中可能会漏掉元素。
for(int i=0;i<list.size();i++){
int val = list.get(i);
if(val==target){
list.remove(i);
}
}
}
实现结果:
有没有发现一个问题,我在链表中加入两个连续的相同的元素,但我们在for循环正序遍历的时候,它会漏掉一个元素,原因就是:当我们在删除一个元素的时候,我们的链表的索引和链表的大小都会发生改变,而删除的元素的下一个元素会向前移动一个位置,所以当i=1的时候,我们删除了2,此时下一个2会移动到当前索引位置,但是下步删除的元素是从索引i=2的时候开始的,所以会漏掉这个元素。为了解决这个问题,我们可以采用for循环倒叙遍历的方法,删除元素时,后面的元素向前移动并不影响我们向前遍历。
for循环倒序遍历的代码实现:
public void delete2(List<Integer> list,int target){
//所以要采取倒序遍历的方法来删除元素
for(int i=list.size()-1;i>=0;i--){
if(list.get(i)==target){
list.remove(i);
}
}
}
结果:
采用iterator遍历删除的代码实现:
public void delete(List list,int target){
Iterator iterator = list.iterator();
while(iterator.hasNext()){
if(iterator.next().equals(target)){
iterator.remove();
}
}
}
结果:
整个类的代码
package com.zcl.collection;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* Author:markusZhang
* VM Args:
* Date:Create in 2020/2/5 15:07
*/
public class ListDemo {
@Test
public void test(){
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(5);
delete(list,2);
print(list);
}
private void delete1(List<Integer> list, int target) {
//正序遍历删除元素的时候会出现一个问题就是在删除的过程中可能会漏掉元素。
for(int i=0;i<list.size();i++){
int val = list.get(i);
if(val==target){
list.remove(i);
}
}
}
public void print(List list){
Iterator iterator = list.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
}
public void delete(List list,int target){
Iterator iterator = list.iterator();
while(iterator.hasNext()){
if(iterator.next().equals(target)){
iterator.remove();
}
}
}
public void delete2(List<Integer> list,int target){
//所以要采取倒序遍历的方法来删除元素
for(int i=list.size()-1;i>=0;i--){
if(list.get(i)==target){
list.remove(i);
}
}
}
}