把链表头移到尾部

时间:2014-03-27 00:30:21

标签: java linked-list

我需要在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;
}

3 个答案:

答案 0 :(得分:4)

您想删除列表的头部并使其成为新的尾部。你应该弄清楚如何在头脑中做到这一点,代码将是这个的逻辑表示。

  1. 删除列表的头部。新的头脑成为下一个项目。
  2. 现在,已删除的项目是独立的;之后什么都没有。
  3. 将节点放在列表的末尾。新的尾巴成为那个节点。
  4. 正如您所看到的,您现在的代码并不完全是这样。一步完成一步:

    所以,第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 :(得分:0)

你可以这样做:

public void moveFirstToLast(LinkedList<E> list){
    if(list.size() < 2)
        return;
    E aux = list.get(0);
    list.remove(0);
    list.add(list.size(),aux);
}

答案 2 :(得分:0)

你可以这样做:

LinkedList<E> list = new LinkedList<E>();
list.addLast(list.pop());