首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当删除链表中的最后一个节点时,我将temp赋值为null,但它仍然在那里,没有被删除。Java

当删除链表中的最后一个节点时,将temp赋值为null只是将temp的引用指向null,并不会真正删除该节点。这是因为在Java中,对象的删除是由垃圾回收器来负责的,只有当一个对象没有任何引用指向它时,垃圾回收器才会将其回收。

要删除链表中的最后一个节点,可以采取以下步骤:

  1. 遍历链表,找到倒数第二个节点,记为prev。
  2. 将prev的next指针指向null,即将最后一个节点从链表中断开。
  3. 如果需要,可以将temp节点设置为null,以便垃圾回收器可以回收该节点。

以下是一个示例代码:

代码语言:txt
复制
public class LinkedList {
    private Node head;

    private class Node {
        private int data;
        private Node next;

        public Node(int data) {
            this.data = data;
            this.next = null;
        }
    }

    public void deleteLastNode() {
        if (head == null) {
            return;
        }

        if (head.next == null) {
            head = null;
            return;
        }

        Node prev = null;
        Node temp = head;

        while (temp.next != null) {
            prev = temp;
            temp = temp.next;
        }

        prev.next = null;
        temp = null;
    }
}

在这个示例代码中,deleteLastNode()方法用于删除链表中的最后一个节点。首先判断链表是否为空,如果为空则直接返回。然后判断链表是否只有一个节点,如果是,则将head置为null。接下来,使用两个指针prev和temp遍历链表,直到temp指向最后一个节点。然后将prev的next指针指向null,断开最后一个节点的连接。最后,将temp设置为null,以便垃圾回收器回收该节点。

这是一个简单的链表删除最后一个节点的实现,适用于单向链表。如果是双向链表,删除最后一个节点的步骤会稍有不同。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C语言单链表的基本操作总结(增删改查)「建议收藏」

而最后一个节点的指针指向必须为空NULL,从链表的原理来看不用担心链表的长度会超出范围这种问题。...首先创建一个节点并申请一个节点的内存,之后对传入节点的数据进行赋值,注意尾添加的新节点的指针应指向空;此时分两种情况,1是链表中一个节点都没有,那么这个节点既是头结点也是尾结点;2是已经有节点,那么新添加的节点将成为最后一个节点...,如果链表为空或者没有甲则无法插入,如果链表不为空并且甲在这个链表中,则还要看甲是在链表中间还是甲就在最后的尾巴上,如果在尾巴上则新插入的即为尾巴如图1,若在甲乙之间则需要先连上后面乙再连上前面的甲,如图...//尾巴指针为NULL end->next=NULL; } } 尾删除的过程和前面一样首先应判断这个链表是不是为空或者只有一个节点,若只有一个节点则直接置NULL,若不为空,则先通过遍历找到倒数第二个节点...,安徽将最后一个节点释放内存,再讲倒数第二个节点设置为end,然后将它的指针指向NULL。

59710

C语言单链表的基本操作总结(增删改查),建议收藏!

而最后一个节点的指针指向必须为空NULL,从链表的原理来看不用担心链表的长度会超出范围这种问题。...首先创建一个节点并申请一个节点的内存,之后对传入节点的数据进行赋值,注意尾添加的新节点的指针应指向空;此时分两种情况,1是链表中一个节点都没有,那么这个节点既是头结点也是尾结点;2是已经有节点,那么新添加的节点将成为最后一个节点...,如果链表为空或者没有甲则无法插入,如果链表不为空并且甲在这个链表中,则还要看甲是在链表中间还是甲就在最后的尾巴上,如果在尾巴上则新插入的即为尾巴如图1,若在甲乙之间则需要先连上后面乙再连上前面的甲,如图...//尾巴指针为NULL end->next=NULL; } } 尾删除的过程和前面一样首先应判断这个链表是不是为空或者只有一个节点,若只有一个节点则直接置NULL,若不为空,则先通过遍历找到倒数第二个节点...,安徽将最后一个节点释放内存,再讲倒数第二个节点设置为end,然后将它的指针指向NULL。

1.3K30
  • Qz学算法-数据结构篇(链表、栈)

    ,帮助遍历整个链表代码实现要创建两个对象一个是节点对象,一个是链表对象做add添加时,先找到链表的最后,如果这个链表没有最后,那么我们加入的这个node节点就是这次的头指针指向下一个节点javapublic...temp = temp.next; } //当退出while循环时,temp就指向了链表的最后 //将最后这个节点的next指向新的节点 temp.next...(默认添加到双线链表的最后)先找到双线链表的最后这个节点temp.next = newHeroNodenewHeroNode.pre=temp修改思路和原来的单向链表一样删除因为是双向链表,因此,我么可以实现自我删除某个节点直接找到要删除的这个节点...; } //如果没有找到最后,将temp后移 temp = temp.next; } //当退出while循环时...提示:用一个不带头结点的循环链表来处理Josephus问题:先构成一个有个结点的单循环链表,然后由结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中册则除算法结束

    20920

    大数据技术之_16_Scala学习_13_Scala语言的数据结构和算法_Scala学习之旅收官之作

    提示:用一个不带头结点的循环链表来处理 Josephu   问题:先构成一个有 n 个结点的单循环链表,然后由 k 结点起从 1 开始计数,计到 m 时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从...1 开始计数,直到最后一个结点从链表中删除算法结束。...}     // 当退出 while 循环后,temp 指向的就是链表的最后     temp.next = heroNode // 在链表的最后将 英雄对象的地址 赋值给 temp   }   //...}     // 当退出 while 循环后,temp 指向的就是链表的最后     temp.next = heroNode // 在链表的最后将 英雄对象的地址 赋值给 temp     heroNode.pre...问题:先构成一个有 n 个结点的单循环链表,然后由 k 结点起从 1 开始计数,计到 m 时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从 1 开始计数,直到最后一个结点从链表中删除算法结束

    1.6K10

    java数据结构和算法(一)

    1.稀疏数组sparsearray 基本介绍: 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。...= null) { temp = temp.next; } //当退出while循环时temp就指向了链表的最后 temp.next...单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除 时节点,总是找到temp,temp是待删除节点的前一个节点(认真体会)....= null) { temp = temp.next; } //当退出while循环时temp就指向了链表的最后 temp.next...用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束

    57730

    史上最全单链表的增删改查反转等操作汇总以及5种排序算法(C语言)

    链表实际存储的是一个一个的节点,真正的数据元素包含在这些节点中,如图 4 所示: ?   因此,链表中每个节点的具体实现,需要使用 C 语言中的结构体,具体实现代码如下。...1.插入到链表的头部(头节点之后),作为首元节点;   2.插入到链表中间的某个位置;   3.插入到链表的最末端,作为链表中最后一个数据元素;   虽然新元素的插入位置不固定,但是链表插入元素的思想是固定的...%d is \r\n",a); PrintList(head); } } ### 7.删除链表元素,要注意删除链表尾还是链表头   从链表中删除指定数据元素时,实则就是将存有该数据元素的节点从链表中摘除...因此,从链表中删除数据元素需要进行以下 2 步操作:   1.将结点从链表中摘下来;   2.手动释放掉结点,回收被结点占用的存储空间;  &emsp...第一次时,ptmp为空,整个链表赋值给tmp后只剩下第一个元素*/ tmp->next = ptmp; /*新的链表赋值给ptmp*/

    1.6K50

    《剑指 Offer (第 2 版)》链表部分 JavaScript 题解

    删除链表的节点 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。 返回删除后的链表的头节点。...shan-chu-lian-biao-de-jie-dian-lcof/ 「解题思路」 遍历找到要删除的节点,将前一个节点的next指向后一个节点,最后返回头节点。...此时两个指针同步向后走,当第一个指针 fast 走到链表的尾部空节点时,则此时 slow 指针刚好指向链表的倒数第k个节点。...在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。...如果这两个节点中的任何一个节点的新节点没有被创建,我们都立刻递归地进行创建。当我们拷贝完成,回溯到当前层时,我们即可完成当前节点的指针赋值。

    24640

    数据结构之链表

    return head; } /** * 添加节点到单向链表 * 当不考虑编号顺序时,找到当前链表的最后节点,将最后这个节点的 next 指向新的节点...temp.next; } // 当退出 while 循环时, temp 就指向了链表的最后 // 将最后这个节点的 next,指向新的节点...单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到temp,temp是待删除节点的前一个节点 分析 双向链表的遍历,添加,修改,删除的操作思路...temp.next; } // 当退出 while 循环时, temp 就指向了链表的最后 // 形成一个双向链表 temp.next...提示:用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束

    5410

    Java实现单向链表

    ,将两种(双向/单向)链表的最后一个结点指向第一个结点从而实现循环 操作链表要时刻记住的是: 节点中指针域指向的就是一个节点了!...三、Java实现链表 算法: 遍历 查找 清空 销毁 求长度 排序 删除节点 插入节点 首先,我们定义一个类作为节点 数据域 指针域 为了操作方便我就直接定义成public了。...(增加节点) 向链表中插入数据: 找到尾节点进行插入 即使头节点.next为null,不走while循环,也是将头节点与新节点连接的(我已经将head节点初始化过了,因此没必要判断头节点是否为null...= null),退出循环就会找到尾节点) 遍历链表 从首节点(有效节点)开始,只要不为null,就输出 给定位置插入节点到链表中 将原本由上一个节点的指向交由插入的节点来指向 上一个节点指针域指向想要插入的节点...对链表进行排序 使用冒泡算法对其进行排序 找到链表中倒数第k个节点 设置两个指针p1、p2,让p2比p1快k个节点,同时向后遍历,当p2为空,则p1为倒数第k个节点 删除链表重复数据 操作跟冒泡排序差不多

    2.6K103

    【数据结构】—— 单链表的增删改查

    按顺序插入到链表最后 按照编号的顺序添加 编写显示该链表的方法 修改节点信息 删除节点 编写SingleLinkedListDemo类进行演示 获取单链表中的节点个数 将单链表反转 查找单链表中倒数第k...(1)先创建一个 head头节点,作用就是表示单链表的头 (2)后面每添加一个节点,就直接加入到链表最后,也可以理解为每有一个新节点,我们就把最后一个节点的 next域 指向新节点 链表为空的条件:head.next...== null(表示头节点的下一位为空) 链表最后的条件:temp.next == null (temp为辅助变量) //先初始化一个头节点,头节点不要动,如果改动头节点那么就不好去找到链表最顶端的节点了...;//将temp指向head //遍历链表,找到链表最后 while(true) { //当temp的域等于空时,说明temp找到了链表最后了...后移指向下一个数据 temp = temp.next; } //当退出了 while 循环时,那么 temp 就指向了链表的最后

    26820

    双向链表

    分析 双向链表的遍历,添加、修改、删除的操作思路 遍历方合单链表一样,只是可以向前、向后查找 添加(默认添加到双向链表的最后) (1)先找到双向链表的最后这个节点 (2)temp.next = new...DataNode(); (3)newDataNode.Pre = temp; 修改思路和原理跟单向链表一样 删除 (1)因为是双向链表,因此,我们可以实现自我删除某个节点 (2)直接找到要删除的这个节点...//找到链表的最后 if (temp.NextNode == null) break; //如果没有找到最后,将temp后移 temp...= temp.NextNode; } //当推出while循环时,temp就指向了链表的最后 //形成一个双向链表 temp.NextNode...= temp.NextNode; //将当前节点的下一个节点赋值为需要新增的节点 temp.NextNode = node; node.PreNode

    49210

    2022-12-01

    双指针实现 因为在数组中实现删除元素的操作,本质上是将元素给覆盖掉,即将删除元素的后面元素向前移动一位 代码实现双指针: //伪代码 int low;//定义一个慢指针,用来存新数组的下标 for(int...=null){//遍历链表直到(指针域指向最后一个位置的时候指针为空) if(head.val==val){//取原头结点的值与目标值相比较 pre.next...addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。...addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。 addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。...; pre=cur; //将cur重新赋值到原链表的头结点上 cur=temp; } return

    32040

    Java之手写LinkedList(下)

    element在链表中首次出现的位置,如果链表中无此节点的对象则返回-1 /** * 返回节点对象element在链表中首次出现的位置,如果链表中无此节点的对象则返回-1 * @param t * @return...element在链表中最后出现的位置,如果链表中无此节点的对象则返回-1。...这个时候只需要从后往前面找了,last就是最后一个元素,size-1就是最后一个元素的索引了这样就比较好找多了 /** * 返回节点对象t在链表中最后出现的位置,如果链表中无此节点的对象则返回-1 *...node = new Node(t); /** * 当第一次添加的时候就将节点赋值给first,表示第一个节点的引用 */ if(this.first...* * 直接将倒数第二个节点替换成last节点 * 然后将last节点的next值设置为null就好了 * 首先也的判断一下last的上一个节点是否为null

    77310

    【云+社区年度征文】LeetCode中链表类题目解析

    1.1链表中的的指针是什么 我们学习C语言时,学过指针,它描述的是指向一个内存地址,在Java语言中,是不存在指针的,但是我们可以把它理解为引用。...当我们将某个变量(对象)赋值给指针(引用),实际上就是将这个变量(对象)的地址赋值给指针(引用)。 p—>next = q; //表示p节点的后继指针存储了q节点的内存地址。...我们先普及下这两个概念: 指针丢失:自己定义的指针不知道指到哪里了,没有明确的指向。 内存泄漏:链表中的节点没有确切的指针判断,运行时会抛出空指针异常。...= p—>next—>next; 在删除节点,考虑到删除的节点可能是链表中的第一个节点,我们通常在链表头部加入哨兵(头结点),这样可以使得删除链表的代码是一致的,不用再额外考虑是否是第一个节点的情况...这些判断条件需要结合自己的实际场景来使用 2、必须掌握的几类题目 在上面的学习中,我们对链表的一些易错的概念进行了解析,下面,我们就真正的代码实践,我在LeetCode上刷题时发现,链表题目通常分为以下几类

    47910

    回顾一下常见的链表操作

    恰好下午我翻阅之前提交记录的时候,看到了这部分,今天就分享一下几道题,回顾下列表的基本操作。 希望能给大家一些帮助。 #237 删除列表中某个节点 这是最基础的一道题了。...题目描述: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。 现有一个链表 -- head = [4,5,1,9],它可以表示为: ?...而将a赋值给b,其实就是将a保存的地址复制给b一份,然后调用b也会去找到和a相同地址的{}。 a.val = 1就是将a地址指向的对象{}增加一个值为1的属性val。...a = {}则将一个新的{}的地址赋值给了a,此时覆盖掉了原来保存的{ val: 1 }对象的地址,然而b所保存的地址仍然指向原来的 { val: 1 } 放到本题来说就是题目给的参数node(相当于示例中的...b),只是题意链表中的对应节点(相当于示例中的a)的地址副本,对node(b)赋值相当于直接覆盖掉这个副本的值,但是原节点(a)保存的地址并不会变。

    34310

    【Java数据结构和算法】004-链表:单向链表

    说明: 先创建一个头节点“元素”,默认nextId为null,每添加一个元素,将上一个元素的nextId赋值为自己的id,将自己的nextId复制为null; 3、遍历 从头结点拿到第一个元素的id,依次通过...分析: 在中间插入一个id肯定是要给插入的位置的,比如将一个新的节点插入到id为2的节点之后,那么我们首先需要对链表进行遍历,找到id为2的节点,然会进行相关操作即可,详见代码演示; 7、删除节点 图解.../ 我们将newHead的next赋值给原链表头节点的next,即可完成最终的反转 head.next = newHead.next;//之所以没有使得head=newHead是因为头节点不能动...; 方式二:利用栈这个数据结构,将各个节点压入到栈中,利用栈先进后出的特点,实现逆序打印的效果; 栈的使用演示: 代码: package com.zb.ds; import java.util.Stack.../ 我们将newHead的next赋值给原链表头节点的next,即可完成最终的反转 head.next = newHead.next;//之所以没有使得head=newHead是因为头节点不能动

    7710
    领券