本题目很简单,思路就是用两个指针,第一个指针先走K步,然后第二个指针在走,这样当第一个指针到底末尾的时候,这时第二个指针则刚好是倒是第k个节点的位置。下面是C代码实现。
#include <stdio.h>
#include <stdlib.h>
struct node
{
void* data;
struct node* next;
};
typedef struct node Node;
Node* linkInit()
{
Node* header = NULL;
header = (Node*)malloc(sizeof(Node));
header->data = NULL;
header->next = NULL;
return header;
}
void linkAddNode(Node* header, int value)
{
if (header != NULL)
{
Node* n = (Node*)malloc(sizeof(Node));
n->data = (void*)value;
n->next = header->next;
header->next = n;
}
return;
}
void linkPrint(Node* header)
{
if (header != NULL)
{
Node* tmp = header->next;
while(tmp != NULL)
{
printf("the data is %d\n", (int)tmp->data);
tmp = tmp->next;
}
}
}
void linkClear(Node* header)
{
if (header != NULL)
{
Node* tmp = header;
while(tmp != NULL)
{
Node* p = tmp;
tmp = tmp->next;
free(p);
p = NULL;
}
}
}
void linkGetR(Node* header, int k)
{
if (header != NULL && k > 0)
{
int i = 0;
Node* n = header->next;
Node* tmp = header->next;
while(tmp != NULL)
{
if (i < k)
{
tmp = tmp->next;
i++;
}
else
{
tmp = tmp->next;
n = n->next;
}
}
if (i >= k)
{
printf("the rev data is %d\n", (int)n->data);
}
else
{
printf("can't find the rev data\n");
}
}
else
{
printf("can't find the rev data\n");
}
}
int main(int argv, char* args[])
{
Node* header = linkInit();
linkAddNode(header, 1);
linkAddNode(header, 2);
linkAddNode(header, 3);
linkAddNode(header, 4);
linkPrint(header);
linkGetR(header, 0);
linkGetR(header, 1);
linkGetR(header, 2);
linkGetR(header, 3);
linkGetR(header, 4);
linkGetR(header, 5);
linkClear(header);
return 0;
}