剑指offer一书中指出对单链表的从尾到头打印的方法有两种,这两种方法都在不对链表进行修改的基础上进行的。
1:使用栈数据结构,遍历单链表,将数据存放到栈中,利用栈的“先进后出”特性,实现单链表的从尾到头打印;但是这种方法会造成额外的存储空间开销;
2:使用递归的方法,这里本质也是利用栈的特性,因为递归的本质是栈结构。但是这种方法,在链表的数据量较大的时候,可能会导致程序栈溢出。
下面的程序分别给出了以上两种方法的链表打印。
#include <iostream>
#include <stack>
using namespace std;
struct Node
{
int m_iValue;
Node* m_pNext;
};
void printLinkReverse(Node* head)
{
if(head!=nullptr)
{
if(head->m_pNext!=nullptr)
printLinkReverse(head->m_pNext);
cout << head->m_iValue << " ";
}
}
void printLinkReverse2(Node* head)
{
stack<int> Nodestack;
Node* pTmp=head;
while(pTmp!=nullptr)
{
Nodestack.push(pTmp->m_iValue);
pTmp=pTmp->m_pNext;
}
while(!Nodestack.empty())
{
cout << Nodestack.top() << " ";
Nodestack.pop();
}
}
void print(Node* head)
{
while(head->m_pNext!=nullptr)
{
cout << head->m_iValue << " ";
head=head->m_pNext;
}
cout << head->m_iValue << endl;
}
Node* instNodeHead(Node* head, int value)
{
Node* p0=new Node;
p0->m_iValue=value;
p0->m_pNext=head->m_pNext;
head->m_pNext=p0;
return head;
}
Node* create()
{
Node* head = new Node;
head->m_iValue=0;
head->m_pNext=nullptr;
int value;
while(cin>>value)
{
if(value==0)break;
instNodeHead(head,value);
}
return head;
}
int main(void)
{
Node* pHead;
pHead=create();
print(pHead);
printLinkReverse(pHead);
printLinkReverse2(pHead);
return 0;
}