题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。
我们知道链表的特性,查找其中某一个结点的时间复杂度是O(n),不像数组那样可以直接通过下表在O(1)的时间内查找到指定元素。因此如果要查找链表元素,我们必须从头结点开始顺序往后查找。现在需要输出链表中的每个结点的值,而必须是从尾到头的,也就是先遍历的结点后输出,一个典型的“先进后出”的数据结构,这就让我们想到了栈的结构,如果我们在遍历链表的时候,将遍历的结果存放在一个栈中,遍历结束以后输出栈中的元素值,就是我们需要的从尾到头打印链表结点值。
下面给出代码实例,在代码实例中还包括了创建单链表结点的方法CreateListNode(),往链表尾部添加结点的方法AddToTail(),以及逆序输出链表结点值的方法PrintListInReversedOrder()。这里又注意到既然想到用栈来实现,那么也可以用递归的方法来实现,递归的本质就是一个栈结构,所以逆序输出链表值有两种实现方式。
View Code
#include<iostream> #include<stdlib.h> #include<stack> using namespace std; //链表结构 struct ListNode { int m_nValue; ListNode* m_pNext; }; //创建一个链表结点 ListNode* CreateListNode(int value) { ListNode *pNode=new ListNode(); pNode->m_nValue=value; pNode->m_pNext=NULL; return pNode; } void PrintListNode(ListNode* pNode) { } //遍历链表中的所有结点 void PrintList(ListNode* pHead) { ListNode *pNode=pHead; while(pNode!=NULL) { cout<<pNode->m_nValue<<" "; pNode=pNode->m_pNext; } cout<<endl; } //往链表末尾添加结点 /* 注意这里pHead是一个指向指针的指针,在主函数中一般传递的是引用。 因为如果要为链表添加结点,那么就会修改链表结构,所以必须传递引用才能够保存修改后的结构。 */ void AddToTail(ListNode** pHead,int value) { ListNode* pNew=new ListNode();//新插入的结点 pNew->m_nValue=value; pNew->m_pNext=NULL; if(*pHead==NULL)//空链表 { *pHead=pNew; } else { ListNode* pNode=*pHead; while(pNode->m_pNext!=NULL) pNode=pNode->m_pNext; pNode->m_pNext=pNew; } } void PrintListInReversedOrderStack(ListNode *pHead)//使用栈 { ListNode* pNode=pHead; stack<ListNode*> nodes; while(pNode!=NULL) { nodes.push(pNode); pNode=pNode->m_pNext; } while(!nodes.empty()) { pNode=nodes.top(); cout<<pNode->m_nValue<<" "; nodes.pop(); } cout<<endl; } void PrintListInReversedOrderRecursion(ListNode *pHead)//使用递归 { ListNode* pNode=pHead; if(pNode!=NULL)//判断当前结点是否为空 { if(pNode->m_pNext!=NULL)//判断下一个结点是否为空,如果不为空则递归调用 PrintListInReversedOrderRecursion(pNode->m_pNext); } cout<<pNode->m_nValue<<" "; } void main() { ListNode* pNode1=CreateListNode(1);//创建一个结点 PrintList(pNode1);//打印 AddToTail(&pNode1,2);//为链表添加一个结点 AddToTail(&pNode1,3);//为链表添加一个结点 AddToTail(&pNode1,4);//为链表添加一个结点 AddToTail(&pNode1,5);//为链表添加一个结点 AddToTail(&pNode1,6);//为链表添加一个结点 AddToTail(&pNode1,7);//为链表添加一个结点 PrintList(pNode1);//打印 PrintListInReversedOrderStack(pNode1); PrintListInReversedOrderRecursion(pNode1); system("pause"); }
输出结果:
1
1 2 3 4 5 6 7
7 6 5 4 3 2 1
7 6 5 4 3 2 1