当前位置: 首页 > 知识库问答 >
问题:

使用递归打印反向链表

昌山
2023-03-14

我试图以相反的顺序打印一个链表,但实际上没有使用递归进行反转,但我的输出结果非常奇怪。看起来我的代码基本上选择了第一个节点,并在打印完链表的其余部分(按原始顺序)后将其打印出来。我所写的代码(据我所知)是正确的,并且与internet上解决此问题的代码相匹配。

这是我的代码:

public class PrintLinkedListRecursively {

public static void printReverse(Node<Integer> temp) {
    if(temp == null) {
        return;
    }
    
    print(temp.next);
    System.out.print(temp.data);
    
}

public static Node<Integer> input() {
    Scanner scn = new Scanner(System.in);
    int data = scn.nextInt();
    Node<Integer> head = null, tail = null;
    
    while(data!=-1) {
        Node<Integer> currentNode = new Node<Integer>(data);
        if(head == null) {
            head = currentNode;
            tail = currentNode;
        }else {
            tail.next = currentNode;
            tail = tail.next;
        }
        
        data = scn.nextInt();
    }
    
    return head;
    
}

public static void main(String[] args) {        
    Node<Integer> head = input();
    printReverse(head);

}
}

以下是节点类:

public class Node<T> {

T data;
Node<T> next;

Node(T data){
    this.data = data;
}
}

这是我给出的输入,然后是输出:

1 2 3 4 5 -1
2 3 4 5 1

这里发生的另一个奇怪的事情是,如果我改变递归的条件,假设我这样做:

if(temp.next.next.next == null){
   return;
}

然后是原始代码的其余部分,它实际上仍然给我相同的输出。知道我哪里出错了吗?

共有1个答案

柯浩壤
2023-03-14

尝试将函数重写为:

public static void printReverse(Node<Integer> temp) {
    if(temp == null) {
        return;
    }
    printReverse(temp.next);
    System.out.print(temp.data);
}
 类似资料:
  • 还缺少的是将最后一个节点的next赋值为NULL。 在任何世界里,像这样的东西会起作用吗?它给出了一个运行时/分段错误。

  • 我在Hackerrank上解决反向挑战的指纹 方法接受一个参数-链表的头部。您不应该从stdin/console中读取任何输入。头部可能是空的,所以不应该打印任何东西。按照与stdout/console相反的顺序打印链表的元素(使用printf或cout),每行一个。 NB:节点的结构为struct Node{int data;struct Node*next;}

  • 我做了一个使用递归方法反转单链表的函数。然而,我在执行下面的代码时遇到了一些困难: 我应该如何在ReverseCursive函数/方法中传递第二个参数,以便执行它? 作为第二个参数,我想简单地传递链表的头节点。但是我不知道如何从类的init方法中获取头节点linked_list 我试了几件事,但都解决不了。也许我不太擅长OOP概念。有人能帮我解决这个问题吗?