通过《剑指offer 名企面试官精讲典型编程题》看到一道讲解链表的题目。
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值
链表定义如下:
typedef struct _NODE
{
T Data;
_NODE* pNext;
}NODE, *PNODE;
书中提到解决问题可以利用栈,“后进先出”的特点实现这种顺序,每经过一个节点的时候,把该节点放到一个栈中。
当遍历完整个链表后,再从栈顶开始逐个输出节点的值。此时输出的节点顺序就已经反转过来了。
栈实现的方式代码如下:
void revse_printfAll()
{
if (m_pHead == NULL)
{
return;
}
NODE* pTemp = m_pHead;
// stack 实现
stack <NODE*> nodes;
while (pTemp!=NULL)
{
nodes.push(pTemp);
pTemp = pTemp->pNext;
}
while (!nodes.empty())
{
pTemp = nodes.top();
cout << pTemp->Data;
nodes.pop();
}
}
既然可以通过栈,那也可用通过vector来实现的。所以随手查看了一下vector的用法,写出与栈实现类似的代码。
void revse_printfAll()
{
// vector实现
printf("\n");
vector <NODE*> nodes1;
while (pTemp != NULL)
{
nodes1.push_back(pTemp);
pTemp = pTemp->pNext;
}
while (!nodes1.empty())
{
pTemp = nodes1.back();
cout << pTemp->Data;
nodes1.pop_back();
}
}