[劍指Offer]7.從尾到頭打印鏈表
題目1511:從尾到頭打印鏈表
時間限製:1 秒
內存限製:128 兆
特殊判題:否
提交:1082
解決:350
- 題目描述:
-
輸入一個鏈表,從尾到頭打印鏈表每個節點的值。
- 輸入:
-
每個輸入文件僅包含一組測試樣例。
每一組測試案例包含多行,每行一個大於0的整數,代表一個鏈表的節點。第一行是鏈表第一個節點的值,依次類推。當輸入到-1時代表鏈表輸入完畢。-1本身不屬於鏈表。
- 輸出:
-
對應每個測試案例,以從尾到頭的順序輸出鏈表每個節點的值,每個值占一行。
- 樣例輸入:
-
1 2 3 4 5 -1
- 樣例輸出:
-
5 4 3 2 1
/*********************************
* 日期:2013-10-18
* 作者:SJF0115
* 題號: 九度OJ 題目1511:從尾到頭打印鏈表
* 來源:https://ac.jobdu.com/problem.php?pid=1511
* 結果:AC
* 來源:劍指Offer
* 總結:
**********************************/
#include<iostream>
#include<malloc.h>
#include<stdio.h>
#include<stack>
using namespace std;
typedef struct ListNode{
int value;
struct ListNode *next;
}ListNode;
//從尾到頭輸出鏈表
int ListReverse(ListNode *head){
stack<int> stack;
ListNode *p;
p = head->next;
//遍曆鏈表,把每個節點數值添加到棧中
while(p != NULL){
stack.push(p->value);
p = p->next;
}
//輸出棧
while(!stack.empty()){
printf("%d\n",stack.top());
stack.pop();
}
return 0;
}
int main()
{
int i,n;
//初始化
ListNode *head = (ListNode *)malloc(sizeof(ListNode));
ListNode *p;
head->next = NULL;
p = head;
while(scanf("%d",&n)!= EOF){
//n = -1一個測試用例的結束
if(n != -1){
//創建鏈表
ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->value = n;
newNode->next = p->next;
p->next = newNode;
p = newNode;
}
//輸出
else{
/*p = head->next;
while(p != NULL){
printf("%d\n",p->value);
p = p->next;
}*/
//從尾到頭輸出
ListReverse(head);
//初始化
head->next = NULL;
p = head;
}
}
return 0;
}
【解析】


代碼二
/*---------------------------------------
* 日期:2015-07-20
* 作者:SJF0115
* 題目: 7.從尾到頭打印鏈表
* 結果:AC
* 網址:https://www.nowcoder.com/books/coding-interviews/d0267f7f55b3412ba93bd35cfa8e8035?rp=1
* 來源:劍指Offer
* 博客:
-----------------------------------------*/
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
struct ListNode{
int val;
ListNode *next;
ListNode(int x):val(x),next(nullptr){}
};
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> result;
// 遞歸實現
helper(head,result);
return result;
}
private:
void helper(ListNode* head,vector<int> &result){
if(head){
if(head->next){
helper(head->next,result);
}//if
result.push_back(head->val);
}//if
}
};
int main(){
Solution s;
ListNode* root = new ListNode(1);
ListNode* node1 = new ListNode(2);
ListNode* node2 = new ListNode(3);
ListNode* node3 = new ListNode(4);
ListNode* node4 = new ListNode(5);
root->next = node1;
node1->next = node2;
node2->next = node3;
node3->next = node4;
vector<int> result = s.printListFromTailToHead(root);
for(int i = 0;i < result.size();++i){
cout<<result[i]<<endl;
}//for
return 0;
}
代碼三
/*---------------------------------------
* 日期:2015-07-20
* 作者:SJF0115
* 題目: 7.從尾到頭打印鏈表
* 結果:AC
* 網址:https://www.nowcoder.com/books/coding-interviews/d0267f7f55b3412ba93bd35cfa8e8035?rp=1
* 來源:劍指Offer
* 博客:
-----------------------------------------*/
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
struct ListNode{
int val;
ListNode *next;
ListNode(int x):val(x),next(nullptr){}
};
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> result;
ListNode* p = head;
while(p){
result.insert(result.begin(),p->val);
p = p->next;
}//while
return result;
}
};
int main(){
Solution s;
ListNode* root = new ListNode(1);
ListNode* node1 = new ListNode(2);
ListNode* node2 = new ListNode(3);
ListNode* node3 = new ListNode(4);
ListNode* node4 = new ListNode(5);
root->next = node1;
node1->next = node2;
node2->next = node3;
node3->next = node4;
vector<int> result = s.printListFromTailToHead(root);
for(int i = 0;i < result.size();++i){
cout<<result[i]<<endl;
}//for
return 0;
}
最後更新:2017-04-03 14:53:45