2 u010775468 u010775468 于 2016.05.04 19:28 提问

java中的链表类的remove问题

新人初学java,有些基本问题不是很懂,求教各位,谢谢
java中的LinkedList这个链表类中有这样一个方法,removefirst方法,含义是删除,并且返回链表的第一个元素,我想问下各位,是不是只要是删除了第一个元素,那么后面的第二个元素会顶到原来第一个元素的位置上,当我第二次调用这个方法时,相当于删除了链表的第一个元素(原来的第二个元素)?
谢谢各位了

4个回答

eson_15
eson_15   2016.05.04 19:55
已采纳

是的,removeFirst()方法返回链表第一个元素,并且删掉这个元素,当再一次调用该方法时,又会获得第一个元素(原来的第二个)并删除之。给你看一下removeFirst()的源码你就知道了:

 public E removeFirst() {  
        final Node<E> f = first;  
        if (f == null)  
            throw new NoSuchElementException();  
        return unlinkFirst(f); //private方法  
    }  

    private E unlinkFirst(Node<E> f) {  
        // assert f == first && f != null; //需确保f为头结点,且链表不为Null    
        final E element = f.item; //获得节点的值  
        final Node<E> next = f.next; //获得头结点下一个节点  
        f.item = null;  
        f.next = null; // help GC  
        first = next;  
        if (next == null)  
            //如果next为null,则表示f为last结点,此时链表即为空链表   
            last = null;  
        else  
            //修改next的前向指针,因为first结点的前向指针为null   
            next.prev = null;  
        size--;  
        modCount++;  
        return element;  
    }  

具体的关于LinkedList其他问题你可以参考这篇博文http://blog.csdn.net/eson_15/article/details/51135944

eson_15
eson_15 补充一下,删了之后你不能理解为第二个元素顶到第一个元素那,因为链表中是不同的节点,删除了一个节点后,这个节点就会被垃圾回收器回收,他的左右节点还是在原来的位置,地址并没有改变,只是改变了他们前后的指向而已。比如A->B->C,删了B后,A->C,但是A和C的地址不会改变,不能理解为C往左顶了一个位置~
大约 2 年之前 回复
magege2015
magege2015   2016.05.04 19:51

直接看代码
LinkedList list = new LinkedList();
list.add("0");
list.add("1");
list.add("2");
list.add("3");
System.out.println("Before remove-"+list.toString());

    list.remove(0);
    System.out.println("first remove-"+list.toString());
    list.remove(0);
    System.out.println("second remove-"+list.toString());

    输出的结果:Before remove-[0, 1, 2, 3]
                                            first remove-[1, 2, 3]
                                            second remove-[2, 3]
bdmh
bdmh   Ds   Rxr 2016.05.04 20:02

你的理解是对的,每次操作的是当前列表中的第一个对象

u010775468
u010775468   2016.05.04 21:32

谢谢大家的热心帮助,太谢谢了,由于只能采纳一个,请大家见谅,真心感谢各位

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
[C++]Remove Linked List Elements 删除链表中的元素
leetcode 原题链接:https://leetcode.com/problems/remove-linked-list-elements/ Remove all elements from a linked list of integers that have value val. Example Given: 1 --> 2 --> 6 --> 3 --> 4 -
【LeetCode-面试算法经典-Java实现】【203-Remove Linked List Elements(删除单链表中的元素)】
【203-Remove Linked List Elements(删除单链表中的元素)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github.com/Wang-Jun-Chao】原题  Remove all elements from a linked list of integers that have value val.   Exampl
单链表删除(Delete)或者去除(Remove)节点面试题总结
单链表删除(Delete)或者去除(Remove)节点面试题总结
【LeetCode-面试算法经典-Java实现】【019-Remove Nth Node From End of List(移除单链表的倒数第N个节点)】
【019-Remove Nth Node From End of List(移除单链表的倒数第N个节点)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given a linked list, remove the nth node from the end of list and return its head.   For example, Given lin
Java数据结构-单链表
本文将数据结构知识中重要知识点:数据元素,结点,数据类型,抽象数据类型,抽象数据类型的实现、以及对新定义的数据结构的应用等知识通过下述java代码的形式串联起来,以从宏观上对数据结构有一个透彻的理解和认识。        我们要使用单链表这个数据结构来解决问题的前提是首先得创建一个单链表数据结构。创建单链表数据结构,就得自定义个单链表的抽象数据类型,抽象数据类型只是对数据结构定义一组逻辑操作
java可用的链表类,Object可以接受任何类
package cn.mdln.program; /**  * 可用链表用了Object,可以进行了类的统一,可以接受任何类  * @author Administrator  *  */ public class MyLinkList { public static void main(String[] args) { Linklist all=new Linklist(
数据结构总结 链表、栈、队列、排序、数组、树
因为数据结构有一点难度,有些lazy的同学不愿意去深究,学完了代码都没打几个,没错说的就是你肖兆菲同学,以下我将我打的电脑代码复制粘贴过来 首先先看链表  关于单链表: 1、概念                 在单链表中由于数据元素的存储空间一般不是连续的,因此为了完善的表示单链表的逻辑结构,其中每一个数据元素必须由两部分构成:一部分是数据元素
JAVA中类与链表
1.test.java import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputS
java中链表功能的实现
今天我们学习了java的链表数据结构的实现,创建一个Node类,里面定义数据和一个Node类,然后是构造方法传值。 类里面定义4个方法,分别可以获取和设置类的Node类指向和数据。 然后再创建一个MyLinkList类来定义我自己的操作链表数据结构的方法,分别由增删查改的功能。 今天我只是实现了:1.获取链表长度 2.增加数据 3.查找节点 4.插入数据 5.修改数据 。 删除数据我还没有
java单链表的添加、插入、删除
package nodelist; public class LinkListTest { public Node head = new Node();// 定义一个头节点 public LinkListTest() { } /** * 添加一个节点 *  * @param data */ public void addNode(int data) {