为什么此链表递归方法不起作用?

时间:2020-06-27 13:59:41

标签: java recursion data-structures

我试图实现一种递归方法来反向链接列表,这是代码:

public class MyListNode {
int val;
MyListNode next;
MyListNode() {}
MyListNode(int val) { this.val = val; }
MyListNode(int val, MyListNode next) { this.val = val; this.next = next; }
public static void main(String[] args){
   MyListNode head = buildList(new int[]{1,2,3,4,5});
   MyListNode newHead = reverseList(head);
}

static MyListNode buildList(int[] a){
    MyListNode head = new MyListNode(a[0]);
    MyListNode current = head;
    for(int i=1; i<a.length; i++){
        current.next = new MyListNode(a[i]);
        current = current.next;
    }
    return head;
}

public static MyListNode reverseList(MyListNode head) {
    MyListNode newhead = null;
    recursiveReverse(head, newhead);
    return newhead;
}

static void  recursiveReverse(MyListNode head, MyListNode rest) {
    if(head == null){
        return;
    }
    MyListNode temp = head.next;
    head.next = rest;
    rest = head;
    head = temp;
    recursiveReverse(head, rest);
    System.out.println("rest->" + rest.val);
}

MyListNode iterativeReverse(MyListNode head){
    MyListNode prev = null;
    MyListNode curr = head;
    while(curr != null){
        MyListNode temp = curr.next;
        curr.next = prev;
        prev = curr;
        curr = temp;
    }
    return prev;
}

}

我认为,一旦以更深层次的递归方法更改了堆内存中的引用,它将保留 返回给呼叫者后相同。 但是看起来有些不对劲。 你能帮忙澄清一下吗?

2 个答案:

答案 0 :(得分:1)

static MyListNode  recursiveReverse(MyListNode head, MyListNode rest) {
    if(head == null){
        return null;
    }
    if(head.next == null){
        head.next = rest;
        return head;
    }
    MyListNode temp = head.next;
    head.next = rest;
    rest = head;
    head = temp;
    return recursiveReverse(head, rest);
}

在Hans Ke st ing发表评论后,我得到了这种工作方法。

答案 1 :(得分:0)

你为什么不做那样的事情。 很抱歉出现语法错误(我正在通过电话查询)。

Int[] arrayOne = {1,2,3,4,5,6,7};
List<int> headList = arrayOne.toList();
List<int> reverseList= headList.OrderByDesc(x=> IndexOf(x)).toList();
相关问题