009-查找链表中倒数第k个结点

来源:互联网 发布:食不厌精脍不厌细 知乎 编辑:程序博客网 时间:2024/05/17 06:21
// 009.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <malloc.h>struct ListNode{intm_nKey;struct ListNode *m_pNext;};struct ListNode *CreatList(int number){struct ListNode *head = NULL;struct ListNode *cur  = NULL;struct ListNode *temp = NULL;head = (struct ListNode*)malloc(sizeof(struct ListNode));if (NULL == head){return NULL;}head->m_nKey = 0;head->m_pNext = NULL;temp = head;printf("List data number %d\n", number);for (int i=0; i<number; i++){cur = (struct ListNode*)malloc(sizeof(struct ListNode));if (cur == NULL){return NULL;}printf("List Id%02d ", i);printf("Input data  ");scanf("%d", &cur->m_nKey);cur->m_pNext = NULL;if (i==0){head = cur;temp = cur;}else{cur->m_pNext = NULL;temp->m_pNext = cur;}temp = cur;}return head;}bool PrintList(struct ListNode* pHead){if (NULL == pHead){return false;}int i=0;struct ListNode* pTemp = pHead;do {++i;printf("List number: %d  Data:%d\n",i, pTemp->m_nKey);pTemp = pTemp->m_pNext;//pTemp指向下一个节点的指针} while (pTemp != NULL);//最后一个节点的指针元素为NULLreturn true;}//获取长度int GetListLen(struct ListNode* pHead){if (NULL == pHead){return 0;}int len = 0;struct ListNode* pTemp = pHead;do {++len;pTemp = pTemp->m_pNext;} while (pTemp != NULL);return len;}//打印出倒数第K个元素,最尾端的元素为倒数第0个//只能顺序遍历第len-1-k个void PrintKthData(struct ListNode *pHead, int k){if (NULL == pHead || k > (GetListLen(pHead)-1)){return;}struct ListNode* pFirst = pHead;// struct ListNode* pLast = pHead;// do // {// pLast = pLast->m_pNext;// } while (pLast->m_pNext != NULL);//获得最尾部指针for (int i=0; i< GetListLen(pHead)-1-k; i++){pFirst=pFirst->m_pNext;}printf("Kth data: %d\n", pFirst->m_nKey);}//题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。int main(int argc, char* argv[]){struct ListNode* pHead = NULL;int len = 0;pHead = CreatList(5);PrintList(pHead);len = GetListLen(pHead);PrintKthData(pHead, 4);return 0;}