单链表 - 将最后一个节点放在第一个节点之后

时间:2018-05-28 14:11:09

标签: java data-structures singly-linked-list

假设我的列表是1-> 2-> 3-> 4-> 5。我想把最后一个节点放在第一个节点之后,所以它就像1-> 5-> 2-> 3-> 4。这是我的代码,但它不起作用

public void Manipulate(){
        Node curr = head;
        Node next = null;
        Node last = head;

        while(last.next != null){
            last = last.next;
        }

        next = curr.next;
        last.next = next;
        curr.next = next.next;

    }


 public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        SinglyLinkedList lista = new SinglyLinkedList();

        int a = sc.nextInt();
        int b = sc.nextInt();
        lista.addFirst(a);
        lista.insertAfter(a, b);

        for(int i = 0; i < 2; i ++){
            int c = b;
            b = sc.nextInt();
            lista.insertAfter(c, b);
        }

        lista.addLast(34);
        lista.addLast(55);
        lista.addLast("Ginger");

        lista.Manipulate();
        System.out.println(lista);

    }

3 个答案:

答案 0 :(得分:0)

public void Manipulate() {
    Node penultimate = null;
    Node last = head;

    while(last.next != null){
        penultimate = last;
        last = last.next;
    }
    if (penultimate != null){ // closes the list
        penultimate.next = null;
    }
    if (last != head) { // move last element to second place
        last.next = head.next;
        head.next = last;
    }
}

答案 1 :(得分:0)

你已经有了一些改进建议,所以这里有一点解释你实际上做错了什么。

您的代码(按原样)的结果将是:

  

1→3→4-&GT; 5→2→3→4-&GT; 5→2→3→4-将5-&GT ; 2→3→4-&GT; 5→2→3→4-&GT; 5→2→3→4-将5-→2 - 将3-将4-&GT; 5→2→3→ - 将4-&GT; 5→2→3→4-&GT; 5→ 2→3→ - 将4-&GT; 5→2→3→4-&GT; 5→2→3→4-将5-&GT ; 2→3→4-&GT; 5→2→3→ - 将4-&GT; 5→2→3→4-将5- &GT; 2→3→4-&GT; 5→2→3→4-&GT; 5→2→3→4-&GT; 5→ 2-> 3-> 4-> 5-> 2-> 3-> ......(永远地进行)

这就是为什么在尝试打印无限野兽时内存不足的原因。

第一个错误:您需要确保将作为新的最后一个元素的元素不再具有您的前一个元素next

第二个错误:你的head元素应该将前一个元素作为next,而不是其前next元素的next元素。

答案 2 :(得分:0)

    // Edge case: list has zero or 1 node:
    if(head == null || head.next == null) {
       return;
    }        
    Node prev = null;
    Node last = head;

    while(last.next != null){
        prev = last;
        last = last.next;
    }

    Node tmp = head.next;
    head.next = last;
    last.next = tmp;

    // Prevent loop by setting the next of the new last to null
    prev.next = null;