我试图实现一种递归方法来反向链接列表,这是代码:
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;
}
}
我认为,一旦以更深层次的递归方法更改了堆内存中的引用,它将保留 返回给呼叫者后相同。 但是看起来有些不对劲。 你能帮忙澄清一下吗?
答案 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();