您的位置:首页 > 职场人生

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

2013-07-18 21:34 239 查看


方法一:利用栈实现

C++代码:

#include "stdafx.h"
#include <iostream>
#include <stack>
using namespace std;

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

//从尾到头打印链表
void PrintLinkedListReversely(ListNode *pHead)
{
stack<ListNode *> 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 <iostream>
#include <stack>
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;
}
基于递归的代码很简洁,但它存在缺点:当链表非常长的时候就会导致函数调用的层级很深,从而有可能导致栈溢出。显然相比方法一用栈基于循环实现的代码的鲁棒性更好些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: