面试题4:从尾到头打印链表

2014-11-23 22:30:50 ? 作者: ? 浏览: 3

\

方法一:利用栈实现

C++代码:

 #include "stdafx.h"  
#include   
#include   
using namespace std; 
 
//链表中的结点类型  
struct ListNode 
{ 
    int m_nKey; 
    ListNode *m_pNext; 
}; 
 
//从尾到头打印链表  
void PrintLinkedListReversely(ListNode *pHead) 
{ 
    stack tempStack; 
     
    if (pHead != NULL) 
    { 
        ListNode *pCurrent = pHead; 
        ListNode *pStackNode = NULL; 
 
        while (pCurrent != NULL) 
        { 
            tempStack.push(pCurrent); 
            pCurrent = pCurrent->m_pNext; 
        } 
 
        while (!tempStack.empty()) 
        { 
            pStackNode = tempStack.top(); 
            cout << pStackNode->m_nKey << " "; 
            tempStack.pop(); 
        } 
 
        cout << endl; 
    } 
} 
#include "stdafx.h"
#include 
#include 
using namespace std;

//链表中的结点类型
struct ListNode
{
 int m_nKey;
 ListNode *m_pNext;
};

//从尾到头打印链表
void PrintLinkedListReversely(ListNode *pHead)
{
 stack tempStack;
   
 if (pHead != NULL)
 {
  ListNode *pCurrent = pHead;
        ListNode *pStackNode = NULL;

  while (pCurrent != NULL)
  {
   tempStack.push(pCurrent);
   pCurrent = pCurrent->m_pNext;
  }

        while (!tempStack.empty())
        {
   pStackNode = tempStack.top();
   cout << pStackNode->m_nKey << " ";
   tempStack.pop();
        }

  cout << endl;
 }
}

 

方法二:递归实现

C++代码:


 #include "stdafx.h"  
#include   
#include   
using namespace std; 
 
//链表中的结点类型  
struct ListNode 
{ 
    int m_nKey; 
    ListNode *m_pNext; 
}; 
 
//从尾到头打印链表  
void PrintLinkedListReversely(ListNode *pHead) 
{ 
    if (pHead != NULL) 
    { 
        if (pHead->m_pNext != NULL) 
        { 
            PrintLinkedListReversely(pHead->m_pNext); 
        } 
 
        cout << pHead->m_nKey << " "; 
    } 
} 
 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    bool isHeadNode = true; 
    ListNode *pHeadNode = NULL; 
    ListNode *pListNode = NULL; 
    ListNode *pCurrentTail = NULL; 
 
    while (1) 
    { 
        if (isHeadNode) 
        {           
            pHeadNode = new ListNode(); 
            cin >> pHeadNode->m_nKey; 
            pHeadNode->m_pNext = NULL; 
            pCurrentTail = pHeadNode; 
            isHeadNode = false; 
        } 
        else 
        { 
            pListNode = new ListNode(); 
            cin >> pListNode->m_nKey; 
            if (pListNode->m_nKey == -1) 
            { 
                break; 
            } 
            pListNode->m_pNext = NULL; 
            pCurrentTail->m_pNext = pListNode; 
            pCurrentTail = pListNode; 
        } 
    } 
 
    PrintLinkedListReversely(pHeadNode); 
 
    ListNode *pNode = pHeadNode; 
    ListNode *pNext = NULL; 
    while (pNode != NULL) 
    { 
        pNext = pNode->m_pNext; 
        delete pNode; 
        pNode = pNext; 
    }    
 
    system("pause"); 
    return 0; 
} 
#include "stdafx.h"
#include 
#include 
using namespace std;

//链表中的结点类型
struct ListNode
{
 int m_nKey;
 ListNode *m_pNext;
};

//从尾到头打印链表
void PrintLinkedListReversely(ListNode *pHead)
{
 if (pHead != NULL)
 {
  if (pHead->m_pNext != NULL)
  {
   PrintLinkedListReversely(pHead->m_pNext);
  }

  cout << pHead->m_nKey << " ";
 }
}

int _tmain(int argc, _TCHAR* argv[])
{
 bool isHeadNode = true;
 ListNode *pHeadNode = NULL;
 ListNode *pListNode = NULL;
 ListNode *pCurrentTail = NULL;

 while (1)
 {
  if (isHeadNode)
  {    
   pHeadNode = new ListNode();
   cin >> pHeadNode->m_nKey;
   pHeadNode->m_pNext = NULL;
   pCurrentTail = pHeadNode;
   isHeadNode = false;
  }
  else
  {
   pListNode = new ListNode();
   cin >> pListNode->m_nKey;
   if (pListNode->m_nKey == -1)
   {
    break;
   }
   pListNode->m_pNext = NULL;
   pCurrentTail->m_pNext = pListNode;
   pCurrentTail = pListNode;
  }
 }

 PrintLinkedListReversely(pHeadNode);

 ListNode *pNode = pHeadNode;
 ListNode *pNext = NULL;
 while (pNode != NULL)
 {
  pNext = pNode->m_pNext;
  delete pNode;
  pNode = pNext;
 }  

 system("pause");
 return 0;
}

基于递归的代码很简洁,但它存在缺点:当链表非常长的时候就会导致函数调用的层级很深,从而有可能导致栈溢出。显然相比方法一用栈基于循环实现的代码的鲁棒性更好些。

-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: