Как исправить следующий код, чтобы получить обратный список ссылок для вывода? - PullRequest
0 голосов
/ 25 марта 2020

Следующий код - моя попытка реализовать классы SinglyLinkedListNode и SinglyLinkedList и использовать метод SinglyLinkedListNode reverse(SinglyLinkedListNode head) для обращения к этому связанному списку.

Входные данные состоят из первой строки с указанием количества тестовых случаев, t. И для каждого тестового примера первая строка, n, представляет количество элементов в связанном списке. В следующем n количестве строк каждая будет содержать элемент из этого списка, поэтому входные данные выглядят следующим образом:

1 (number of test cases)
5 (number of elements in list)
1 (element in list)
2 (element in list)
3 (element in list)
4 (element in list)
5 (element in list)

Как исправить следующий код, чтобы он мог распечатать этот перевернутый связанный список, таким образом, что результат будет следующим:

5 4 3 2 1

Поскольку мой код вместо этого выводит следующее:

1
5
1
2
3
4
5

1 2 3 4 5 

Мой код:

import java.util.Scanner;

public class ReverseLinkedList {

    static class SinglyLinkedListNode {
        public int data;
        public SinglyLinkedListNode next;

        public SinglyLinkedListNode(int nodeData) {
            data = nodeData;
            next = null;
        }
    }

    static class SinglyLinkedList {
        private SinglyLinkedListNode head;
        private SinglyLinkedListNode tail;

        public SinglyLinkedList() {
            SinglyLinkedListNode head = null;
            SinglyLinkedListNode tail = null;
        }

        public void insertNode(int nodeData) {
            SinglyLinkedListNode node = new SinglyLinkedListNode(nodeData);

            if (this.head == null) {
                this.head = node;
            } else {
                this.tail.next = node;
            }

            this.tail = node;
        }

        public SinglyLinkedListNode reverse(SinglyLinkedListNode head) {
            SinglyLinkedListNode previous = null;
            SinglyLinkedListNode current = head;
            SinglyLinkedListNode next = null;
            while (current != null) {
                next = current.next;
                current.next = previous;
                previous = current;
                current = next;
            }
            return previous;
        }

        public void printLinkedList() {
            SinglyLinkedListNode node = head;
            while (node != null) {
                System.out.print(node.data + " ");
                node = node.next;
            }
        }
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        SinglyLinkedList list = new SinglyLinkedList();

        int testCases = input.nextInt();

        if (testCases <= 10) {
            input.nextLine();
            int size = input.nextInt();
            if (size <= 1000) {
                for (int i = 0; i < size; i++) {
                    list.insertNode(input.nextInt());
                }
                list.reverse(list.tail);
                list.printLinkedList();
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 25 марта 2020
use list.reverse(list.head)   

и измените ваш обратный метод как

 SinglyLinkedListNode previous = null; 
    SinglyLinkedListNode current = head; 
    SinglyLinkedListNode next = null; 
    while (current != null) { 
        next = current.next; 
        current.next = previous; 
        previous = current; 
        current = next; 
    } 
    head= previous; 
    return head;

Также в вашем методе printLinkedList set

      SinglyLinkedListNode node = tail; // instead of head
0 голосов
/ 25 марта 2020

Вы должны передать заголовок связанного списка вместо tail, чтобы изменить метод.

list.reverse(list.head);
...