提示:设置一前一后两个指针,一个指针步长为1,另一个指针步长为n,当一个指针走到链表尾端时,
另一指针指向的元素即为链表倒数第n个元素。
#include <stdio.h> #include <stdlib.h> #include "LinkList.h" void createLinkList(LNode **p) { setnull(p); /*建议链表并设置为空表*/ int n = 10, i; srand(time(0)); for (i = 1; i <= n; i++) { insert(p, rand() % 100 + 1, i); } /*插入数据到链表*/ } LNode* getLNodeByIndex(LNode* head, int index) { if (!head || index < 1) { return NULL; } int j = 1; LNode *q = head; while (j < index && q != null) { q = q->next; j++; } if (q != null) { return q; } else { printf("位置参数不正确!\n"); return NULL; } } LNode* getNumByIndexFromRear(LNode* head, int index) { LNode* begin = head; LNode* end = getLNodeByIndex(head, index); if (!end) { return NULL; } while (end->next) { begin = begin->next; end = end->next; } return begin; } LNode* findLastElem(LNode* head, int last) { if (!head) { return NULL; } LNode* prev = head; LNode* next = head; while (last-- && next) { next = next->next; } if (last+1) { return NULL; } while (next) { prev = prev->next; next = next->next; } return prev; } int main(void) { setvbuf(stdout, NULL, _IONBF, 0); LNode *head; /*定义静态变量*/ createLinkList(&head); display(&head); /*显示链表所有数据*/ int index = 3; puts("input last index:"); scanf("%d", &index); // LNode* node = getNumByIndexFromRear(head, index); LNode *node = findLastElem(head, index); if (node) { printf("LastIndex%3d:, Elem:%3d\n", index, node->data); } else { puts("Invalid Input."); } return EXIT_SUCCESS; }