首页
学习
活动
专区
工具
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

58810

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

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

1.2K30
  • 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开始计数,直到最后一个结点从链表中册则除算法结束

    20420

    大数据技术之_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开始计数,直到最后一个结点从链表删除算法结束

    57430

    史上最全单链表增删改查反转等操作汇总以及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 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点最后返回新头引用。...如果这两个节点任何一个节点节点没有创建,我们都立刻递归地进行创建。当我们拷贝完成,回溯到当前层,我们即可完成当前节点指针赋值

    24040

    数据结构之链表

    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了。...(增加节点) 向链表插入数据: 找到尾节点进行插入 即使头节点.nextnull,不走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 == nulltemp为辅助变量) //先初始化一个节点,头节点不要动,如果改动头节点那么就不好去找到链表最顶端节点了...;//temp指向head //遍历链表,找到链表最后 while(true) { //temp域等于空,说明temp找到了链表最后了...后移指向下一个数据 temp = temp.next; } //退出了 while 循环,那么 temp 就指向了链表最后

    26520

    双向链表

    分析 双向链表遍历,添加、修改、删除操作思路 遍历方合单链表一样,只是可以向前、向后查找 添加(默认添加到双向链表最后) (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

    48610

    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

    31840

    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

    77210

    回顾一下常见链表操作

    恰好下午翻阅之前提交记录时候,看到了这部分,今天就分享一下几道题,回顾下列表基本操作。 希望能给大家一些帮助。 #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)保存地址并不会变。

    33910

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

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

    47410

    【数据结构】线性表代码实现:顺序存储结构 | 链式存储结构

    ){ //初始化一个指针指向链表节点 int j =1; Node p; p = *node; //j<i就遍历链表,让p指针向后移动,不断指向下一个节点...key) { //初始化一个指针指向链表节点 int j = 1; Node *p = node; //jnext; /* 让p指向链表L一个结点 */ j = 1; /* j计数器 */ while (p && j<i) /* p不为空或者计数器j还没有等于i,循环继续 */ {...>next; /* 让p指向链表L一个结点 */ j = 1; /* j计数器 */ while (p && j<i) /* p不为空或者计数器j还没有等于i,循环继续 */ {...>next; /* 让p指向链表L一个结点 */ j = 1; /* j计数器 */ while (p && j<i) /* p不为空或者计数器j还没有等于i,循环继续 */ {

    1.9K50

    线性表

    point: 序列=有序性 多个元素线性表,第一个元素没有前驱,最后一个元素没有后继,其他元素有且仅有一个前驱,一个后继。...基于指针实现,但Java没有指针。或者说,是C变种指针,称为引用。与C不同是,Java引用在考虑安全性前提下,是不允许修改。...【网上看到了一个关于Java指针和C++区别比喻】 在java可以坐飞机到指定目的地,但是你不能开飞机(安全)。但是在C++可以自己开飞机(操作飞机)--具有危险性。...换句话说,Java指针只能使用,而不能像C++可以自由修改。 【如果Java中指针引用是不可修改,那么链表插入删除操作导致next域中引用改变是如何实现?】...Java通过堆栈来存储对象,栈存放堆对象地址,堆存放具体对象,而堆的确是不可修改,但栈对象地址是可以修改,而链表节点中next域中存放正是栈中下个节点对象地址。

    41200
    领券