#include #include struct Node { char *p; struct Node *next; }; struct List { struct Node *head; }; struct Node *cycleExist(struct List *list) { struct Node *iter1 = list->head; struct Node *iter2 = list->head; while (iter2 != NULL) { iter1 = iter1->next; iter2 = iter2->next; if (iter2 == NULL) { break; } iter2 = iter2->next; if (iter1 == iter2) { break; } } if (iter2 == NULL) { return NULL; } iter1 = list->head; // iter1指向头结点, iter2不动 while (iter1 != iter2) { iter1 = iter1->next; iter2 = iter2->next; } return iter1; } int main() { int n; scanf("%d", &n); // 创建整个的结点数组或指针 struct Node *node_arr = malloc(sizeof(struct Node) * n); // n 个结点 for (int i = 0; i < n; i++) { struct Node *node = node_arr + i; node->p = malloc(21); } for (int sid = 1; sid <= n; sid++) { struct Node *snode = node_arr + sid - 1; // 取source node int tid; scanf("%s%d", snode->p, &tid); if (tid >=1 && tid <= n) { struct Node *tnode = node_arr + tid - 1; // 取target node snode->next = tnode; } } struct List list; list.head = node_arr; struct Node *node = cycleExist(&list); if (node) { printf("%s", node->p); } else { printf("-1"); } for (int i = 0; i < n; i++) { struct Node *node = node_arr + i; free(node->p); } free(node_arr); return 0; }