递归链表。我究竟做错了什么?

时间:2016-04-06 14:02:30

标签: java recursion linked-list singly-linked-list

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);
   }
}

这是我的代码。它不打印任何东西。

我认为由于递归,它指向空指针,因此在空位置没有数据。

请告诉我如何才能使代码正确无误。

提前致谢

3 个答案:

答案 0 :(得分:1)

问题是,reverseLL在递归调用后,headhead没有任何作用。

基本情况是正确的:当nullnull时,您返回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;之前的分配中完成的。注意该方法如何返回链中的最后一个非空节点。

Demo

答案 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