每天一算法(输出链表倒数第k个元素)

来源:互联网 发布:淘宝的发票在哪里申请 编辑:程序博客网 时间:2024/05/29 14:00

题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针
链表结点定义如下:  
struct ListNode
{
  int m_nKey;
  ListNode* m_pNext;
};


思路:

题目要求输出链表倒数第K个节点,那我们就把链表反转,输出第K个节点的值就可以了。

/*-----------------------------Copyright by yuucyf. 2011.05.08------------------------------*/#include "stdafx.h"#include <iostream>#include <assert.h>using namespace std;template <class T>struct S_ListNode{  T m_nKey;  S_ListNode* m_pNext;  S_ListNode()  {  m_pNext = NULL;  }};template <class T>S_ListNode<T>* ReverseList(S_ListNode<T>* psHead){    if (!psHead || !(psHead->m_pNext)) return psHead;        S_ListNode<T>* psPrev = NULL;    while (psHead)    {        S_ListNode<T> * psTemp = psHead;        psHead = psHead->m_pNext;        psTemp->m_pNext = psPrev;        psPrev = psTemp;    }    return psPrev;}template <class T>void BuildSList(S_ListNode<T>* &psRet, int nSize){assert(nSize > 0);S_ListNode<T>* psHead = new S_ListNode<T>;assert(NULL != psHead);psHead->m_nKey = nSize;psRet = psHead;while (--nSize){S_ListNode<T> *psTemp = new S_ListNode<T>;assert(NULL != psTemp);psTemp->m_nKey = nSize;psHead->m_pNext = psTemp;psHead = psHead->m_pNext;}}template <class T>void OutputNodeValue(int nK, const S_ListNode<T> *psHead){int nIndex = nK;while (nIndex-- && psHead){psHead = psHead->m_pNext;}if (psHead)cout << "链表倒数第" << nK << "个数为" << psHead->m_nKey << endl ;}int _tmain(int argc, _TCHAR* argv[]){S_ListNode<int> *psHead = NULL;BuildSList(psHead, 10);psHead = ReverseList(psHead);OutputNodeValue(2, psHead);return 0;}

别人有用递归算法进行的逆排序。


/*-----------------------------Copyright by leeyunce. Modified by yuucyf . 2011.05.08------------------------------*/template<typename T>S_ListNode<T>* ReverseListRecursive(S_ListNode<T>* psHead){    if (!psHead|| !(psHead->m_pNext)) return psHead;    S_ListNode<T>* psRet = ReverseListRecursive(psHead->m_pNext);    psHead->m_pNext->m_pNext = psHead;    psHead->m_pNext = NULL;    return psRet;}


 

原创粉丝点击