文章目录

  • 删除单链表第一次出现的结点
  • 思路
  • 步骤
  • 1. 遍历单链表,找到要删除的节点后,使del指向这个位置。
  • 2. 单链表中可能没有key这个结点。
  • 3. key在头结点的情况
  • 4. 查找key方法的实现
  • 5. 改变结点的指向来实现删除key
  • 代码实现

删除单链表第一次出现的结点

删除前


android LinkedHashMap 删除第一个节点 删除链表第一个节点_结点

删除后

android LinkedHashMap 删除第一个节点 删除链表第一个节点_链表_02


head直接指向了del结点的下一个节点,key就相当于是断掉了链接。

思路

  • 定义一个del,指向要删除的结点。
  • 写一个方法查找单链表中有没有这个结点。
  • 需要判断单链表在不在头结点的位置。
  • 单链表不能是空的。
  • 改变要删除结点的前一个结点的指向,使其直接指向key的后一个结点。

步骤

1. 遍历单链表,找到要删除的节点后,使del指向这个位置。

android LinkedHashMap 删除第一个节点 删除链表第一个节点_结点_03

上图中del指向的结点就是要删除的结点。

2. 单链表中可能没有key这个结点。

android LinkedHashMap 删除第一个节点 删除链表第一个节点_java_04


上图中要删除的是存放4数据的结点,但是遍历完之后也找不到这个结点,所以单链表中没有这个结点。
如果没有key结点,直接返回即可。

3. key在头结点的情况

删除前:

android LinkedHashMap 删除第一个节点 删除链表第一个节点_intellij-idea_05


删除后:

android LinkedHashMap 删除第一个节点 删除链表第一个节点_java_06

上图中要删除的是存放1数据的结点,很明显是单链表的头结点。
如果是这样的话,可以直接让head指向head的下一个结点,将这个结点定位新的头结点。

4. 查找key方法的实现

  • 遍历单链表。
  • 每次遇到一个结点,都与key比较看看是不是要删除的结点。
  • 如果遍历结束未找到key结点,说明单链表中不存在key,直接返回null。
private ListNode findPrevOfKey(int key) { //查找key前一个结点的方法
    ListNode cur = this.head;//代替head向后移动
    //当cur指向链表尾结点的前一个结点时整个链表就判断完了
    while (cur.next != null) {
       //cur指向的地址域,再指向这个地址的数据域里的数据
       if (cur.next.value == key) {
           return cur;//找到了key的前一个位置,此时cur就是key的前一个结点
       }
       cur = cur.next; //没找到调整
    }
    //代码走到这里肯定为空
    return null;//返回null说明没找到
}

5. 改变结点的指向来实现删除key

android LinkedHashMap 删除第一个节点 删除链表第一个节点_java_07

  • 先让del指向cur的下一个结点,del = cur.next

android LinkedHashMap 删除第一个节点 删除链表第一个节点_java_08

  • 改变cur结点的指向,来删除的了结点,cur.next = del.next

    删除一个结点就像是把一个条铁链的一个铁环去掉是一样的。
    需要将去掉铁环的前一个铁环于去掉铁环的下一个铁环链接起来,不然无法组成一个铁链。

代码实现

//删除第一次出现的key结点
public void remove(int key) {
    //key不能超过表的长度
    //先找到要删除的key结点的前一个结点,然后改变这个结点的指向,使其指向key结点的后一个结点
    //链表有可能是空的 - 判断一下
    if (this.head == null) {
        return;
    }
    //第一种情况是key在头结点 - 直接向后移动
    if (this.head.value == key) {
        this.head = this.head.next;//头结点指向头结点的下一个结点
        return;
    }
    //程序走到这里说明链表不是空的,而且key不在头结点处
    ListNode cur = findPrevOfKey(key);//调用此方法后此时cur指向的是key的前一个结点
    //链表中有可能没有key结点
    if (cur == null) {
        System.out.println("链表中没有这个结点!!!");
        return;
    }
    //定义一个del结点,del是要删除的结点
    ListNode del = cur.next;//cur.next指向的是要删除的结点

    //删除
    cur.next = del.next;//当前key结点的前一个结点的地址域指向要删除结点的下一个结点的地址域
}

private ListNode findPrevOfKey(int key) { //查找key前一个结点的方法
    ListNode cur = this.head;//代替head向后移动
    //当cur指向链表尾结点的前一个结点时整个链表就判断完了
    while (cur.next != null) {
       //cur指向的地址域,再指向这个地址的数据域里的数据
       if (cur.next.value == key) {
           return cur;//找到了key的前一个位置,此时cur就是key的前一个结点
       }
       cur = cur.next; //没找到调整
    }
    //代码走到这里肯定为空
    return null;//返回null说明没找到
}

  • 代码中的head表示头结点。
  • key是要删除结点中的值。
  • findPrevOfKey()是用来查找key结点是否存在的方法。