輸入一個鏈表,輸出該鏈表中倒數第k個結點。
(hint: 請務必使用鏈表。)
輸入可能包含多個測試樣例,輸入以EOF結束。
對於每個測試案例,輸入的第一行為兩個整數n和k(0<=n<=1000, 0<=k<=1000):n代表將要輸入的鏈表元素的個數,k代表要查詢倒數第幾個的元素。
輸入的第二行包括n個數t(1<=t<=1000000):代表鏈表中的元素。
對應每個測試案例,
若有結果,輸出相應的查找結果。否則,輸出NULL。
5 2 1 2 3 4 5 1 0 5
4 NULL這個題目比較簡單直接上代碼:
#include#include typedef struct SNode { int data; struct SNode *next; }SNode; SNode* createNode(int vData) { SNode *Node = (SNode*)malloc(sizeof(SNode)); Node->data = vData; Node->next = NULL; return Node; } void deleteNode(SNode **vNode) { (*vNode)->next = NULL; free(*vNode); *vNode = NULL; } SNode* createLinkList(int vN) { int i; int Data; SNode *Head; SNode *Node; SNode *TempNode; scanf(%d, &Data); Head = createNode(Data); TempNode = Head; for (i = 1; i < vN; ++i) { scanf(%d, &Data); Node = createNode(Data); TempNode->next = Node; TempNode = Node; } return Head; } SNode* findKey(SNode *vHead, int vN, int vK) { if (vN == vK) return vHead; int i; SNode *pNode; SNode *qNode; i = 0; pNode = vHead; qNode = vHead; while (i < vK && qNode != NULL) { qNode = qNode->next; ++i; } if (qNode == NULL) return NULL; while (qNode != NULL) { pNode = pNode->next; qNode = qNode->next; } return pNode; } void destroyLinkList(SNode **vHead) { SNode *Node; while (*vHead != NULL) { Node = (*vHead)->next; deleteNode(vHead); *vHead = Node; } } int main() { int N; int K; SNode *Head; SNode *Ret; while (scanf(%d %d, &N, &K) != EOF) { if (K == 0 && K > N) { printf(NULL ); continue; } Head = createLinkList(N); Ret = findKey(Head, N, K); if (Ret == NULL) { printf(NULL ); } else { printf(%d , Ret->data); } destroyLinkList(&Head); } return 0; } /************************************************************** Problem: 1517 User: Language: C Result: Accepted Time:100 ms Memory:912 kb ****************************************************************/