我正在尝试了解链接列表,这对我来说没有什么挑战性。我试图用递归方法反转链接列表。这是我的代码:
cs.ClntSock.BeginSend(cs.BByteBuffer, 0, cs.BByteBuffer.Length, SocketFlags.None,new AsyncCallback(SendCallback), cs);
我遇到的问题是反向方法。当方法结束时,它只返回值为“First”的最后一个节点。通过整个递归,remainingNode只保存并从基本情况中重新调整值,这让我感到困惑。我除了它进一步通过节点。执行该方法后,newList只保存一个节点,下一个节点为null,该节点现在是头。我假设它将使用序列First - >来反转链表。第二 - >第三 - >第四。我做错了什么?
答案 0 :(得分:1)
实际上,一切都在这里工作。您唯一的问题是主要方法 :您没有得到方法的结果。
newList.reverseTest(newList.head);
您需要使用结果实际设置新头:
newList.head = newList.reverseTest(newList.head);
如果您已将方法声明为静态,那么这将更容易看到:
newList.head = ListNode.reverseTest(newList.head);
作为奖励,这里是一个完全递归的等价物:
public static Node reverse(Node head) {
if (head == null || head.next == null) {
return head;
}
Node newHead = reverse(head.next);
// head.next points to the new tail, we push the former head at the end
head.next.next = head;
// now head has become the new tail, we cut the end of the list
head.next = null;
return newHead;
}