个人技术分享

  上篇文章中,我们主要介绍了尾插法,任意位置插入,删除第一次出现的关键字,本篇文章,我们将继续对链表进行一些基本操作,话不多说我们开始~

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主将为大家带来一些有关链表例题,敬请期待叭~