当前位置: 首页 > 知识库问答 >
问题:

方法在链表后面插入和移除节点

孔波
2023-03-14

我试图编写一个方法来插入一个节点和移除链表后面的一个节点。下面是我在其中编写方法的主类。它们在底部(insertBack和removeBack):

public LinkedList()
{
    head = null;
}

public LinkedListNode getHead()
{
    return head;
}
public void setHead(LinkedListNode h)
{
    head = h;
}

public void insertFront(Object item)
{
    if (head == null)
    {
        LinkedListNode nextNode = new LinkedListNode (item);
        head = nextNode;
    }
    else
    {
        LinkedListNode nextNode = new LinkedListNode (item);
        nextNode.setNext(head);
        head = nextNode;
    }
}

public Object removeFront()
{
    if (head == null)
    {
        return head;
    }
    else
    {
        LinkedListNode t = head;
        Object ret = head.getData();
        head = head.getNext();
        t.setNext(null);
        t = null;
        return ret;
    }

}


//insert a front at the end of linked list
public void insertBack(Object myData)
{
    LinkedListNode newNode = new LinkedListNode(myData);

    if (head == null)
    {
        head = newNode;

    }
    else
    {
        LinkedListNode current = head;
        while (current.getNext() != null)
        {
            current = current.getNext();
        }
        current.setNext(newNode);

    }
}

//remove a node at the end of linked list
public Object removeBack()
{

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

    LinkedListNode secondToLast = head;
    while (secondToLast.getNext().getNext() != null)
    {
        secondToLast = secondToLast.getNext();
    }

    secondToLast.setNext(null);
    return head.getData();

}

可能有格式错误,因为我粘贴到这里,但我仍然试图找出如何使用这个网站。当我运行如下所示的驱动程序类时,我会得到如下所示的结果。

public static void main(String[] args)
{
    ValueData data1 = new ValueData("a", 50);
    ValueData data2 = new ValueData("b", 70);
    ValueData data3 = new ValueData("c", 100);

    LinkedList myList = new LinkedList();

    //practice insertBack and removeBack
    myList.insertBack(data1);
    myList.insertBack(data2);
    myList.insertBack(data3);

    System.out.println("Test insertBack and removeBack");

    System.out.println((ValueData) myList.removeBack());
    System.out.println((ValueData) myList.removeBack());
    System.out.println((ValueData) myList.removeBack());
    System.out.println();


    //compare insertFront and removeFront
    System.out.println("Test insertFront and removeFront");
    myList.insertFront(data1);
    myList.insertFront(data2);
    myList.insertFront(data3);

    System.out.println((ValueData)myList.removeFront());
    System.out.println((ValueData)myList.removeFront());
    System.out.println((ValueData)myList.removeFront());
    System.out.println();

RESULTS
Test insertBack and removeBack
a 50.0
a 50.0
null

Test insertFront and removeFront
c 100.0
b 70.0
a 50.0

有人能帮我弄清楚为什么我的removeFront和removeBack方法不起作用吗?

共有1个答案

席烨
2023-03-14

首先,这段代码是不必要的,因为没有引用的对象将被丢弃。

t.setNext(null);
t = null;

这也可能有助于removeBack()

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

LindedListNode current = head;

while(current.getNext() != null) //searching for last node
   current = current.getNext();

current = null; //make the last node null 
 类似资料:
  • 本文向大家介绍PHP实现双链表删除与插入节点的方法示例,包括了PHP实现双链表删除与插入节点的方法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现双链表删除与插入节点的方法。分享给大家供大家参考,具体如下: 概述: 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点

  • 我在做一个程序,没有使用Java的内置链表类;我在从头开始做。除了编写一个将节点插入链表的特定位置的方法外,我在所有方面都取得了成功。 我有一个方法将一个特定的节点设置为“当前”节点。所以,例如,我有一个链表,看起来是这样的:猫-->狗-->使-->好-->宠物,“当前”等于2;这意味着“当前”节点是“狗”。 从这里开始,假设我想在“current”的位置插入一个新节点,它的info字段为AND。

  • 本文向大家介绍jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法),包括了jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery插入节点和移动节点的方法。分享给大家供大家参考,具体如下: 1. 插入节点: 效果图: 2. 移动节点: 效果图: 更多关

  • 我尝试实现循环链表的insert方法。我想我取得了一些成功。 问题:当我显示列表时。display方法将循环,因为链接的每个next变量都链接到一个非Null节点对象。所以head永远不会是空对象。根据我对单链表的回忆,head总是指向列表中的第一个节点或其中包含数据的第一个节点。 我对循环链表的概念理解:根据我的理解,循环链表有点像一个单链表,但有一点小的变化:尾部对象的下一个变量指向头部。 来

  • 本文向大家介绍C++删除链表中间节点的方法,包括了C++删除链表中间节点的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++删除链表中间节点的方法。分享给大家供大家参考,具体如下: 题目: 给定链表头结点head,实现删除链表的中间节点函数。 解题思路及代码: 快慢指针,快指针走两步,慢指针一步。 当快指针走到终点时,慢指针正好是链表中间节点,删除此节点即可。 链表结构定义: 算法

  • 我的任务是创建函数来添加和删除链表中的节点,输入数据为int,字符为with函数调用。我不确定我做错了什么。我得到的唯一错误是:退出时返回代码为-11(SIGSEGV)。还有一个编译器方法:main。cpp:在函数“void listInsertValue(ListNode)”中* 感谢任何帮助。谢谢!