java中的反向链表
我想知道这是否是一个有效的递归解决方案,以及是否可以进行任何改进。我已经用一些输入测试了这个解决方案,它似乎是有效的java中的反向链表,java,pointers,data-structures,linked-list,Java,Pointers,Data Structures,Linked List,我想知道这是否是一个有效的递归解决方案,以及是否可以进行任何改进。我已经用一些输入测试了这个解决方案,它似乎是有效的 public Node reverse(Node head) { if(head == null) { return null; } if (head.next == null) { this.head = head; return head; } Node n = head.next; head.next = null; reverse(n
public Node reverse(Node head) {
if(head == null) {
return null;
}
if (head.next == null) {
this.head = head;
return head;
}
Node n = head.next;
head.next = null;
reverse(n).next = head;
return head;
}
谢谢。在算法方面,我认为这种方法符合您的要求,我相信您需要一个链表 A->B->C 转化为 C->B->A,然后返回A 我只是对这个方法的范围有点困惑,它是Node的实例方法吗?第8行的“这”是什么 有一件事我不确定,如果你不保留其他指向C和B的指针,在反向操作完成后,你会看到列表C->B->A,返回指向A的指针。看起来C和B没有被任何变量指向,它不会被垃圾收集吗?然后被移除?也许这个问题是通过“这个”东西解决的 构造列表的一个好方法应该是返回列表头的方法。但是您的方法返回尾部。 我建议将其作为Node的实例方法,然后使用head调用reverse()方法,并返回新的head
public Node reverse() {
if (this.next == null) {
return this;
}
Node n = this.next;
Node newhead=n.reverse() // After reverse, n should be at the tail
n.next = this;
return newhead;
}
类似于此,但我尚未测试代码是否要基于头部节点进行反转?还是要反转完整的节点列表?我要反转整个列表,然后返回新的头节点。谢谢。实际上我想返回头部,但忘记添加实现。reverse()不应该是链表类的实例吗?我们不是在这里颠倒列表吗?我现在明白你的意思了,很抱歉,我没有意识到这个方法在linkedlist中。在您的情况下,代码可以正常工作。这只是不同的编码风格,我总是对节点对象进行递归,尤其是对列表、树和其他对象。如果您要扩展原始的java.util.LinkedList,那么我建议您查看源代码,我认为这里的变量不仅仅是头。据我所知,还有“first”、“last”等。谢谢,不,我只是在练习编写递归代码,还列出了相关代码。如何使代码返回新的头部而不是尾部?而且,我也不太明白我的“head.next=null;”代码行是如何工作的。我写它是为了将原始头部设置为null,但它不会每次都将头部设置为null吗?@Prasanna在您的方法中,最终返回的“头部”实际上是新的尾部,因此将下一个设置为null是正确的做法。设置整个链表标题的位置实际上是this.head=head;这是有道理的,当你到达当前列表的末尾时,你将其设置为新的头部。所以,如果您有原始的LinkedList l1,在您进行反向操作之后,您将得到一个新列表。节点n=l1。反向(l1.head)n将是原始的head,它是新的列表尾部。l1本身发生了变化,当您再次呼叫l1.head时,您将获得原始的尾巴。再次感谢您帮助我。对不起,我不太明白为什么要退回头部。在我的程序中,如果输入列表是1->2>3>4,列表将更改为4->3->2->1,但我返回1,这是4的旧头整数,这是我打算返回的。我该怎么做?我认为设置this.head=head可以做到这一点,因为当代码到达原始列表的末尾时,我会这样做,但为什么它不能按预期工作呢?