这里我们将介绍逆向打印单链表的三种方法:
- 利用循环以及三个指针,将单链表的_pNext指针的指向改变(这种方法改变了单链表)
- 利用栈的特性“先进后出”来实现,将链表结点的值全部入栈后再依次出栈
利用递归来实现
给出结点
#include<stdio.h>
#include<iostream>
using namespace std;
//单链表
typedef struct Node
{
Node(int data)
:_data(data)
,_pNext(NULL)
{}
int _data;
Node* _pNext;
}*PNode;
方法一:
Node* ReverseList(Node*& pHead)
{
if(pHead == NULL)
return NULL;
Node* pPreNode = pHead;
Node* pCurNode = pHead->_pNext;
Node* pNetNode = pHead->_pNext;
pPreNode->_pNext = NULL;//将第一个结点的_pNext指向NULL,头结点变成尾结点
while(pCurNode)
{
pNetNode = pCurNode->_pNext;
pCurNode->_pNext = pPreNode;
pPreNode= pCurNode;
pCurNode = pNetNode;
}
return pPreNode;
}
方法二:
#include<stack>
void PrintListFromTailToHead(Node* pHead)
{
stack<Node*> nodes;//构建一个栈
Node* pNode = pHead;
while(pNode!=NULL)
{
nodes.push(pNode);//节点入栈
pNode = pNode->_pNext;
}
while(!nodes.empty())
{
pNode = nodes.top();//栈顶的元素
printf("%d\t",pNode->_data);
nodes.pop();//出栈
}
}
方法三:
void PrintListFromTailToHead(Node* pHead)
{
if(pHead==NULL)
return;
PrintListFromTailToHead(pHead->_pNext);
cout<<pHead->_data<<" ";
}
测试代码:
void funtest()
{
Node n1(1);
Node n2(2);
Node n3(3);
Node n4(4);
n1._pNext =&n2;
n2._pNext =&n3;
n3._pNext = &n4;
PrintListFromTailToHead(&n1);
}
int main()
{
funtest();
getchar();
return 0;
}