我知道这个问题已被提出但我想用递归来解决它。列表中的每个节点都包含一个整数值(int val)。我想返回整数值,而不仅仅是打印它。我想出了以下内容:
int findKthNode (node* head, int n){
if(!head)
return 1;
int retval = findkthNode(head->next, n);
if(retval==n)
return head->val;
return 1+retval;
}
一旦到达列表的末尾,我返回1.之后,我将前一个返回值加1,直到我从结尾到达第n个节点。那时我返回该节点的int值。这种方法存在一个问题。我继续加1,直到我回到第一个电话。因此,如果我的列表是1,5,10,20,40,80,100,我最终将返回85,因为n = 2而不是80,因为我会在返回之前再添加1次。我该如何解决这个问题?
另外,我不确定这是否可行,但有没有办法使用递归返回指向第n个最后一个节点的指针。我无法通过单链表找到一种方法。
答案 0 :(得分:7)
不要对两个不同的东西使用相同的变量,使用两个不同的变量。通过引用传递一个整数来跟踪你到底有多少节点,并使用返回结果。
node* findKthNode (node* head, int find, int& found){
if(!head) {
found = 1;
return head;
}
node* retval = findkthNode(head->next, find, found);
if(found==find)
retval = head;
found = found + 1;
return retval;
}
答案 1 :(得分:1)
以下将返回指向最后一个节点的第n个指针,如果节点不足则返回NULL
。
node* findKthNode(node* head, int n)
{
node* rslt = NULL;
doFind(head, n, &rslt);
return rslt;
}
int doFind(node* head, int n, node** rslt)
{
if (head == NULL)
{
return 0;
}
int ret = doFind(head->next, n, rslt);
if (ret == n)
{
*rslt = head;
}
return ret + 1;
}
在这种情况下,n
基于0。要查找列表末尾的项目,请写下:
node* rslt = findKthNode(head, 0);
答案 2 :(得分:0)
您需要两个“返回值”。一个用于返回值,另一个用于返回的深度。
我会在方法签名中添加一个int* depth
参数来“返回”深度。