求链表的倒数第k个数值(亲测有效,环境VS2010)

来源:互联网 发布:恺英网络股票 编辑:程序博客网 时间:2024/05/11 03:35

题目:输入一个链表,输出该链表中倒数第k个结点的值。为符合大家的习惯的,本题目从1开始计数,级链表的尾结点是倒数第一个结点。

代码如下:


#include <stdio.h>#include <stdlib.h>struct ListNode{int m_pValue;ListNode* m_pNext;};/*输入链表为NULL或k为0时都安全返回,鲁棒性良好*/ListNode* FindkthToTail(ListNode* pListHead,unsigned int k){if(pListHead==NULL||k==0)return NULL;ListNode* pFirst=pListHead;ListNode* pSecond=NULL;for(unsigned int i=0;i<k-1;i++){if(pFirst->m_pNext!=NULL)pFirst=pFirst->m_pNext;elsereturn NULL;}pSecond=pListHead;while(pFirst->m_pNext!=NULL){pFirst=pFirst->m_pNext;pSecond=pSecond->m_pNext;}return pSecond;}int main(){//ListNode* pListHead=NULL;//用于测试输入为NULLListNode* pListHead=(ListNode *)malloc(sizeof(ListNode));ListNode* pNew=NULL;ListNode* pOld=pListHead;int input=0;//输入for(int i=0;i<10;i++)//创建链表,给链表输入0-9这10个数{pNew=(ListNode *)malloc(sizeof(ListNode));pNew->m_pValue=i;pNew->m_pNext=NULL;pOld->m_pNext=pNew;pOld=pNew;}scanf("%d",&input);ListNode* p=FindkthToTail(pListHead,input);if(p==NULL)return -1;printf("%d",p->m_pValue);return 0;}

一般我们会从头到尾遍历链表,但此种方法时间复杂度为O(n*n)。上面这个程序运用两个指针来遍历,时间复杂度为O(n).

0 0
原创粉丝点击