文章目录
- 1. 删除单链表中的所有的指定结点
- 1.1 删除思路
- 1.2 删除步骤
- 1.2.1 删除结点不是头结点
- 1.2.2 删除的结点是头结点的情况
 
- 1.3 部分代码思路分析
- 1.4 整体代码演示
 
- 2. 清空单链表
 
 
1. 删除单链表中的所有的指定结点
1.1 删除思路
- 定义一个 cur 来代替 head 遍历单链表。
- 遇到指定结点就开始删除。
- 是不是要删除的结点, cur 都指向下一个结点,直到表遍历完成。
- 单链表中可能没有要删除的结点。
- 定义一个 prev 指向要删除结点的前驱。
- 如果单链表的第一个结点就是要删除的结点,直接将这个结点指向后驱。
1.2 删除步骤
1.2.1 删除结点不是头结点
-  定义 cur 从表的第二个结点开始遍历。 
 定义 prev 从表的 cur 的前驱位置开始遍历。
  
 比较此时 cur 指向结点的值是不是要删除结点的值。
 是就改指向删除,不是就 cur 往后面找。
-  现在要删除的是,值是2的结点。 
 cur 此时指向了要删除的结点,进行改指向删除。
  
 可以看到第一个节点直接指向了第三个节点。
-  cur 指向下一个,prev 指向 cur 的前驱。 
  
 第一个节点存的是第三个节点的地址,也就与第二个结点断开了。
 prev 此时不需要移动即是 cur 的前驱。
 比较此时 cur 指向结点的值是不是要删除结点的值。
 是就改指向删除,不是就 cur 往后面找。
-  比较此时 cur 指向结点的值是不是要删除结点的。 
  
 此时的第一个结点的地址域存的是最后一个结点的地址,也就指向了它。
-  cur 往后走,prev 指向cur的前驱。 
  
 此时 cur 指向结点的值不是要删除的结点,cur指向下一个结点。
  
 此时 cur 为空 遍历结束,跳出循环。所有的要删除的结点都已删除完毕。
  
1.2.2 删除的结点是头结点的情况
如果头结点是要删除的结点,若按照上面的方法删除;
 遍历结束后,头结点是未删除的。

 可以看到此时 cur 为空了,但是还有一个结点未删除。
 解决办法:
判断一下头结点是不是要删除的结点。
判断方法:
- 将头节点与要删除的结点的值比较,看看是不是相等。
- 如果使得话,就直接将头结点指向它的后区即可。
删除后:

1.3 部分代码思路分析
- 如果表是空的直接返回
 //链表中可能是空的
 if(this.head == null) {
     return;
 }
- 定义cur 和 prev
  ListNode cur = this.head.next;//cur指向要删除的结点
  ListNode prev = this.head;//prev指向要删除结点的前驱
- 该结点指向代码
prev.next = cur.next;//要删除结点的前驱的地址域指向key结点的后驱的地址域
cur = cur.next;//要删除的结点指向它的后驱
- 判断头结点是不是要删除的结点的代码
if (this.head.value == key) {
    this.head = this.head.next;//将这个头结点指向它的后驱 - 然后就删除了
}
1.4 整体代码演示
//删除所有key的结点
public void removeAllKey(int key) {
    //链表中可能是空的
    if(this.head == null) {
        return;
    }
    ListNode cur = this.head.next;//cur指向要删除的结点
    ListNode prev = this.head;//prev指向要删除结点的前驱
    //cur不等于空则说明cur未找到尾结点,移动要继续
    while (cur != null) {
       //如果当前的cur指向的数据是我要找的key
       if (cur.value == key) {
           //改变指向删除
           prev.next = cur.next;//要删除结点的前驱的地址域指向key结点的后驱的地址域
           cur = cur.next;//要删除的结点指向它的后驱
       }else{ //若不是要找的 - 跳到下一个结点
           prev = cur;//当前cur结点的前驱指向cur指向的结点
           cur = cur.next;//当前cur结点指向它的后驱
       }
   }
   //如果链表的第一个结点是key
   if (this.head.value == key) {
       this.head = this.head.next;//将这个头结点指向它的后驱 - 然后就删除了
   }
}
2. 清空单链表
释放单链表中每一个结点的对象,直接置为空即可。
代码演示:
public void clear() {
   this.head = null;//将的结点置为空
}










![[附源码]java毕业设计8号体育用品销售及转卖系统](https://img-blog.csdnimg.cn/608c90f6573a434faed416e9108f1ddc.png)









