输入一个链表的头结点,从尾到头打印每一个节点
struct Listnode
{
int m_key;
Listnode* m_pnext;
};
很容易想到用到栈去实现,遍历一遍链表,并入栈,再栈顶逐步获取栈顶元素打印并出栈就好了
void ReversePrintList_stack(const Listnode *pHead)
{
if(pHead == NULL||pHead->m_pnext == NULL)
return;
Listnode *p = pHead->m_pnext;
stack<Listnode*> st;
while(p != NULL)
{
st.push(p);
p = p->m_pnext;
}
while(!st.empty())
{
p = st.top();
cout<<p->m_key<<" ";
st.pop();
}
cout<<endl;
}
从尾到头也可以用递归的方式实现,每次判断数据节点是否为空,然后递归打印数据节点就可以了(看了书上写的才想到),当然如果链表过长也会可能导致栈溢出的情况
void Print(const Listnode *pNode)
{
if(pNode != NULL)
{
Print(pNode->m_pnext);
cout<<pNode->m_key<<" ";
}
}
void ReversePrintList_recursion(const Listnode* pHead)
{
if(pHead != NULL)
{
Print(pHead->m_pnext);
}
cout<<endl;
}
链表初始化及插入操作:
void Insert(Listnode *pHead,int val)
{
if(pHead == NULL)
return;
//Listnode * p = (Listnode*)malloc(sizeof(Listnode));
Listnode * p = new Listnode;
p->m_key = val;
p->m_pnext = pHead->m_pnext;
pHead->m_pnext = p;
}
void Init(Listnode *pHead)
{
pHead->m_pnext = NULL;
}