上篇文章中,我们主要介绍了尾插法,任意位置插入,删除第一次出现的关键字,本篇文章,我们将继续对链表进行一些基本操作,话不多说我们开始~
1.删除所有出现的关键字key
在上一篇文章中,我们已经删除了一个节点,删除所有节点只要重复调用该方法即可,这里我们介绍另一个方法,只遍历一遍就要删除所有节点
1.定义一个引用cur,让cur = =head.next
2.定义一个prev,代表要删除节点的前驱
3.定义循环,循环条件为cur!=null
4.if判断cur.vla = key,并且ucr往后走即cur = cur.next
else,让prev = cur,cur = cur.next
如图

讨论几个特殊情况
如果最后一个元素也是要删除的呢(也就是23)

如图,要删除的系欸但在最后一个时,我们的代码没问题
那么要是在第一个呢
如图

此时我们的代码会跳过第一个节点直接删除第二个,所以,我们要在循环全部走完,单独进行判断head.val = key,head = head.next(注意:此条只能放在最后,因为第一个和第二个都为key的话,删除一个,第一个还是key)
如果头节点为空,代表链表为空,直接返回即可
代码如下
public void removeAllKey(int key){
if(head == null) {
return;
}
ListNode cur = head.next;
ListNode prev = head;
while (cur != null) {
if(cur.val == key) {
prev.next = cur.next;
cur = cur.next;
}else {
prev = cur;
cur = cur.next;
}
}
if(head.val == key) {
head = head.next;
}
}
调用测试
public class test {
public static void main(String[] args) {
MySingleList mySingleList = new MySingleList();
mySingleList.createList();
mySingleList.display();
mySingleList.addLast(23);
mySingleList.display();
mySingleList.removeAllKey(12);
mySingleList.removeAllKey(23);
mySingleList.removeAllKey(56);
mySingleList.display();
}
}
运行截图

2.清空链表
直接将head置空即可,没有引用的对象会被回收
代码如下
public void clear() {
this.head = null;
}
调用测试
public class test {
public static void main(String[] args) {
MySingleList mySingleList = new MySingleList();
mySingleList.createList();
mySingleList.display();
mySingleList.clear();
mySingleList.display();
}
}
运行结果

到此为止,我们这篇文章就结束啦,下一篇up主将为大家带来一些有关链表例题,敬请期待叭~