剑指Offer_6_从尾到头打印链表

时间:2023-03-09 21:53:58
剑指Offer_6_从尾到头打印链表

题目描述

       输入应该链表的头节点 , 从尾到头反过来打印出每个节点的值。链表定义如下 :
 typedef struct ListNode
{
int m_nKey ;
ListNode * m_pNext ;
}ListNode;

  分析:

    可能有人的第一反应是将链表中的节点指针翻转过来。但是改变原有的链表结构可能在某些情况下不被允许。

    打印是一个只读操作,首先遍历一遍链表,但要做到逆序打印,可以用栈将节点里面的值存起来。然后将栈push至空。

链表逆序打印代码 :

 void PrintListNode(ListNode *pHead){
stack<int> sk ;
while(pHead !=NULL){
sk.push(pHead->m_nKey);
pHead = pHead->m_pNext ;
}
// 打印
while(!sk.empty()){
cout << sk.top()<<endl ;
sk.pop();
}
}

完整代码 :

此处链表 listNode 为举例 实例化 为了 0->1->2->3->4->5->6->7->8->9->10->null ;

 #include<iostream>
#include<malloc.h>
#include<stack> using namespace std ; #define N 10 typedef struct ListNode
{
int m_nKey ;
ListNode * m_pNext ;
}ListNode; void PrintListNode(ListNode *pHead){
stack<int> sk ;
while(pHead !=NULL){
sk.push(pHead->m_nKey);
pHead = pHead->m_pNext ;
}
// 打印
while(!sk.empty()){
cout << sk.top()<<endl ;
sk.pop();
}
}
int main(){
ListNode *pHead = (ListNode*)malloc(sizeof(ListNode*)) ;
ListNode *listNode = (ListNode*)malloc(sizeof(ListNode*)) ;
listNode->m_nKey = ;
pHead = listNode ;
for(int i=;i<N;i++){
ListNode *pNew = (ListNode*)malloc(sizeof(ListNode*)) ;
pNew->m_nKey = i+ ;
listNode->m_pNext = pNew ;
listNode = listNode->m_pNext ;
}
listNode->m_pNext = NULL ;
PrintListNode(pHead);
return ;
}

打印结果:


Process returned  (0x0)   execution time : 0.189 s
Press any key to continue.

此题除了使用栈,还可以使用递归。

代码差别只在PrintListNode函数。

 #include<iostream>
#include<malloc.h>
#include<stack> using namespace std ; #define N 10 typedef struct ListNode
{
int m_nKey ;
ListNode * m_pNext ;
}ListNode; void PrintListNode(ListNode *pHead){
if(pHead->m_pNext!=NULL){
PrintListNode(pHead->m_pNext);
}
cout << pHead->m_nKey << endl;
}
int main(){
ListNode *pHead = (ListNode*)malloc(sizeof(ListNode*)) ;
ListNode *listNode = (ListNode*)malloc(sizeof(ListNode*)) ;
listNode->m_nKey = ;
pHead = listNode ;
for(int i=;i<N;i++){
ListNode *pNew = (ListNode*)malloc(sizeof(ListNode*)) ;
pNew->m_nKey = i+ ;
listNode->m_pNext = pNew ;
listNode = listNode->m_pNext ;
}
listNode->m_pNext = NULL ;
PrintListNode(pHead);
return ;
}