Singlely Linked List - поставить последний узел после первого - PullRequest
0 голосов
/ 28 мая 2018

Допустим, у меня есть список, который идет по 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 голосов
/ 28 мая 2018

У вас уже есть предложения по улучшению, поэтому вот небольшое объяснение того, что вы на самом деле сделали неправильно.

Результат вашего кода (как есть) будет:

1-> 3-> 4-> 5-> 2-> 3-> 4-> 5-> 2-> 3-> 4-> 5-> 2-> 3-> 4-> 5-> 2-> 3-> 4-> 5-> 2-> 3-> 4-> 5-> 2-> 3-> 4-> 5-> 2-> 3 -> -> 4-> 5-> 2-> 3-> 4-> 5-> 2-> 3 -> -> 4-> 5-> 2-> 3-> 4-> 5-> 2-> 3-> 4-> 5-> 2-> 3-> 4-> 5-> 2-> 3 -> -> 4-> 5-> 2-> 3-> 4-> 5-> 2-> 3-> 4-> 5-> 2-> 3-> 4-> 5-> 2-> 3-> 4-> 5-> 2-> 3-> 4-> 5-> 2-> 3 -> ... (происходит вечно)

Вот почему вам не хватает памяти при попытке напечатать этого бесконечного зверя.

Первая ошибка: вам нужно убедиться, что элемент, который будет новым последним элементом, больше не будет иметьбывший последний элемент как next.

Вторая ошибка: ваш элемент head должен иметь прежний последний элемент как next, а не элементы next своего бывшего элемента next.

0 голосов
/ 28 мая 2018
    // 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;
0 голосов
/ 28 мая 2018
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;
    }
}
...