因此,我必须递归计算循环链接列表中的节点。我有一个要求使用的标题:
int Recursive(node *head);
是否可以仅使用一个指针来计数此列表中的节点?算法将是什么呢?
答案 0 :(得分:2)
int count(node* head)
{
if(head == nullptr)
return 0;
return countRecursive(head, head->next);
}
int countRecursive(node* head, node* current)
{
if(current == head) // our end condition!
return 1;
return 1 + countRecursive(head, current->next);
}
Basically we go in a circle and stop when we return to the head, adding 1 while
we go.
答案 1 :(得分:0)
您可以分离一个节点以使其成为一个较小的列表,递归计算该列表中的节点,然后重新附加其他节点。在这里,您去了:
int count(Node* head) {
// Base cases: (empty list and 1 node)
if (!head) return 0;
if (head->next == head) return 1;
// Keep a pointer to the node to be removed
Node* temp = head->next;
// Remove the node
head->next = temp->next;
// Get the length of the new list
int result = 1 + count(head);
// Reconnect the node
head->next = temp;
return result;
}