【发布时间】:2021-07-12 00:58:41
【问题描述】:
我正在研究一个反转给定链表的函数的递归实现:
static Node reverse(Node head) {
if(head == null) {
return head;
}
// last node or only one node
if(head.next == null) {
return head;
}
Node newHeadNode = reverse(head.next);
// change references for middle chain
head.next.next = head;
head.next = null;
// send back new head node in every recursion
return newHeadNode;
}
public static void main(String[] args) throws IOException {
LinkedList llist = new LinkedList();
llist.insertNode(20);
llist.insertNode(4);
llist.insertNode(15);
llist.insertNode(85);
Node llistReversed = reverse(llist.head);
printSinglyLinkedList(llistReversed, " ");
}
所以链表节点为:85 15 4 20
我以为在调用reverse 之后head.next 会指向值为15 的第二个节点?如果是这样,这段代码如何(递归地)反转这个链表?
【问题讨论】:
-
您提供的代码没有定义
reverse。请提供足够的代码来了解这是什么意思,并提供构建示例列表并进行调用的代码。 -
@trincot 抱歉,这是我找到的解决方案之一,提前致谢; geeksforgeeks.org/…
-
我明白了。我已经编辑了您的问题,从该来源添加了更多代码。
-
@trincot 非常感谢。我认为我最大的问题是;在我看来 (head.next == null) { return head;} 指向 15。但我理解你的评论说它指向 15,但由于它不为空,所以它进入列表的尾部,但我如果没有某种迭代,看不到这将如何发生。所以在我看来,要么递归调用一直迭代直到它达到空值,要么 head.next 不断地自行迭代直到它找到一个空值!这就是我卡住的地方。谢谢
-
“但我理解你的评论”:不确定你指的是上述哪个 cmets。或者这是对我的回答的评论?在这种情况下,您能否在我的答案下方发表评论?
标签: java c# recursion linked-list singly-linked-list