public class Reverse {
public static void printLL(Node head) {
while(head!=null){
System.out.print(head.getData()+"-->");
head=head.next;
}
}
public static Node reverseLL(Node head){
if(head == null) {
return head;
}
return reverseLL(head.next);
}
public static void main(String[] args) {
Node first=new Node(10);
Node head=first;
Node second=new Node(20);
first.next=second;
Node third=new Node(30);
second.next=third;
Node fourth=new Node(40);
third.next=fourth;
printLL(head);
System.out.println("\nReverse of Linked List is \n");
head=reverseLL(head);
printLL(head);
}
}
这是我的代码。它不打印任何东西。
我认为由于递归,它指向空指针,因此在空位置没有数据。
请告诉我如何才能使代码正确无误。
提前致谢
答案 0 :(得分:1)
问题是,reverseLL
在递归调用后,head
对head
没有任何作用。
基本情况是正确的:当null
为null
时,您返回head
。然而,递归步骤并不完整:您需要反转列表的其余部分,但之后必须将其附加回prior
。
实现此目的的最简单方法是为head.next = prior;
节点传递额外参数,以便您可以
public static Node reverseLL(Node head) {
if(head==null){
return null;
}
return reverseLL(head, null);
}
在你的递归方法中。以下是您的"包装"方法看起来:
head
请注意,它不是递归的 - 它只是调用两个参数的重载。
递归方法知道null
永远不会head.next == null
,所以它的基本情况是public static Node reverseLL(Node head, Node prior) {
Node res;
if (head.next == null) {
res = head;
} else {
res = reverseLL(head.next, head);
}
head.next = prior;
return res;
}
:
head
return
节点的反转是在Enum.GetNames(typeof(Item.Type)).Length;
之前的分配中完成的。注意该方法如何返回链中的最后一个非空节点。
答案 1 :(得分:1)
您的reverseLL
只是浏览了所有节点,当它到达最后一个节点if(head==null)
时,会返回null
。
您需要修复reverseLL
功能。尝试在函数中添加跟踪以逐步了解它的作用。
答案 2 :(得分:1)
你似乎没有错过关于递归的关键点 - 你必须自称。
我建议对printLL
进行更改,以便演示应该有效的递归解决方案。
public static void printLL(Node head) {
if (head != null) {
System.out.print(head.getData() + "-->");
printLL(head.next);
}
}
请注意代码如果有一个头部基本上说,打印它的数据然后打印它head.next
。