程序员面试题精选100题(09)-查找链表中倒数第k个结点

题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下:

template <typename T>struct LinkNode{ T data; LinkNode<T> *link; LinkNode(LinkNode<T> *ptr = NULL){ link = ptr; } LinkNode(const T &item, LinkNode<T> *ptr = NULL){ data = item; link = ptr; } };

分析:为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是输入的是单向链表,只有从前往后的指针而没有从后往前的指针。因此我们需要打开我们的思路。

既然不能从尾结点开始遍历这个链表,我们还是把思路回到头结点上来。假设整个链表有n个结点,那么倒数第k个结点是从头结点开始的第n-k-1个结点(从0开始计数)。如果我们能够得到链表中结点的个数n,那我们只要从头结点开始往后走n-k-1步就可以了。如何得到结点数n?这个不难,只需要从头开始遍历链表,每经过一个结点,计数器加一就行了。

这种思路的时间复杂度是O(n),但需要遍历链表两次。第一次得到链表中结点个数n,第二次得到从头结点开始的第n -k-1个结点即倒数第k个结点。

参考代码:

#include <fstream> #include "LinkedList.h" using namespace std; /////////////////////////////////////////////////////////////////////// // Find the k node from the tail of a list // Input: pListHead - the head of list // k - the distance to the tail // Output: the k node from the tail of a list /////////////////////////////////////////////////////////////////////// LinkNode<int> * FindKthToTail_Solution1(LinkNode<int>* pListHead, const unsigned int k) { if (NULL == pListHead) { return NULL; } // count the nodes number in the list int length = 0; LinkNode<int> *pCurrent = pListHead; while(pCurrent->link != NULL) { pCurrent = pCurrent->link; length ++; } // if the number of nodes in the list is less than k // do nothing if (k >= length) { cout<<"The value of K is greater than the length of the list"<<endl; return NULL; } // the k node from the tail of a list // is the (n - k)th node from the head pCurrent = pListHead; for (int i = 0; i < length - k; i ++) { pCurrent = pCurrent->link; } return pCurrent; } /* //---------------------头结点保存链表的长度----------------------------------------- LinkNode<int> * FindKthToTail_Solution1(LinkNode<int>* pListHead, const unsigned int k) { if (NULL == pListHead) { return NULL; } int length = pListHead->data; // if the number of nodes in the list is less than k // do nothing if (k >= length) { cout<<"The value of K is greater than the length of the list"<<endl; return NULL; } // the k node from the tail of a list // is the (n - k)th node from the head LinkNode<int> *pCurrent = pListHead; for (int i = 0; i < length - k; i ++) { pCurrent = pCurrent->link; } return pCurrent; } */ int main(){ List<int> list; ifstream fin("list.txt"); assert(fin); fin >> list; cout << "The initial list in the file is:/n" << list; int Kth = 6; cout<<"the "<< Kth <<"th node from the tail of the list is: "<<FindKthToTail_Solution1(list.getHead(),Kth)->data<<endl; return 0; }

你可能感兴趣的:(程序员面试题精选100题(09)-查找链表中倒数第k个结点)