当前位置: 首页 > 面试题库 >

将链表的头移到尾

胡泓
2023-03-14
问题内容

我需要用Java编写一个将链表中的第一个元素移动到最后位置的方法。

为此,我相信我必须设置一个节点以引用head之后的第一个元素,然后将下一个节点设置为null。我尝试使用我的方法执行此操作,但是在运行该方法时,输出不正确。

我所剩的班级太多了,无法在此处发布,但是我认为我只需要在概念化如何将第一个元素移到列表末尾方面提供帮助。

我写的方法是:

public void moveFirstToEnd() {
    if (head.next == null) {
        throw new NoSuchElementException();
    }

    Node node = head.next;
    node.next = null;
    head.next = node;
    tail.next = node;
    tail = node;
}

问题答案:

您要删除列表的开头并使其成为新的结尾。您应该想出如何做到这一点,而代码将是对此的逻辑表示。

  1. 删除列表的标题。新的头成为下一个项目。
  2. 现在,被移走的物品独自站立。没事了
  3. 将节点放在列表的末尾。新尾将成为该节点。

如您所见,您的代码现在并没有完全做到这一点。一次完成一个步骤:

因此,步骤1:

Node node = head;
head = head.next; // <- remove head, new head becomes next item

然后,执行步骤2:

node.next = null; // there's nothing after it.

最后,第3步:

tail.next = node; // <- add to end of list
tail = node; // <- becomes new end of list

或者,如果您希望将其可视化:

Node node = head:

+------+    +------+    +------+    +------+
| head |--->|      |--->|      |--->| tail |
+------+    +------+    +------+    +------+
  node

head = head.next:

+------+    +------+    +------+    +------+
|      |--->| head |--->|      |--->| tail |
+------+    +------+    +------+    +------+
  node

node.next = null:

+------+    +------+    +------+    +------+
|      |    | head |--->|      |--->| tail |
+------+    +------+    +------+    +------+
  node

tail.next = node:

            +------+    +------+    +------+    +------+
            | head |--->|      |--->| tail |--->|      |
            +------+    +------+    +------+    +------+
                                                  node

tail = node:

            +------+    +------+    +------+    +------+
            | head |--->|      |--->|      |--->| tail |
            +------+    +------+    +------+    +------+
                                                  node

顺便说一句,如果您已经碰巧定义了popFront(或其他)和/或append操作,请不要忘记也可以使用它们。没有意义重复代码:

Node node = popFront(); // if you have this
append(node); // if you have this


 类似资料:
  • 题目链接 牛客网 题目描述 从尾到头反过来打印出每个结点的值。 解题思路 1. 使用递归 要逆序打印链表 1->2->3(3,2,1),可以先逆序打印链表 2->3(3,2),最后再打印第一个节点 1。而链表 2->3 可以看成一个新的链表,要逆序打印该链表可以继续使用求解函数,也就是在求解函数中调用自己,这就是递归函数。 // java public ArrayList printListFro

  • 一、题目 输入个链表的头结点,从尾到头反过来打印出每个结点的值。 二、解题思路 使用栈的方式进行。 将链表从头到尾压入栈内,出栈的过程就对应着从尾到头。 三、解题代码 public class Test { /** * 结点对象 */ public static class ListNode { int val; // 结点的值

  • 我目前正在为Java中的循环链表工作。我们应该能够在列表的前面插入和后面插入。但是,我已经让这些方法在循环链表类中正常工作。 我得到的结果是 对于第二次插入,这里的next指向null应该指向列表的头部。 节点类 循环链表类 主班

  • 我正在尝试为我的链表类创建一个添加和删除方法。我写了两封信,名字是Head和Tail。 头- 当我试图删除特定节点时,我一直遇到问题,因为Java说我越界了。我想是因为我的头没有指向第一个节点?你们觉得怎么样?还是我完全走错路了...

  • 问题内容: 我正在使用Java开发链表,因此我试图掌握单个链表的概念。 将为12(也与node1相同)。但是,头是什么? 更新: 引用和指针之间有什么区别? Update2: 因此,如果is 和is ,那么这并不意味着以下函数会跳过第一个节点以查看其是否为空吗? 来源:http://www.mycstutorials.com/articles/data_structures/linkedlists

  • 编辑问题以包括所需的行为、特定问题或错误,以及重现问题所需的最短代码。这将有助于其他人回答这个问题。 我试图在C上创建一个单链表。我用3个函数来创建一个基于“DiseaseList”结构的项目,将该项目添加到列表中,然后打印出来。 我已经花了几个小时梳理这些代码,我似乎无法阻止它将这个列表的开头定位到最后一项。只有两点可以改变头部(其中head=*),但这肯定是对我所写内容的误解,因为我无法理解。