[剑指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:从尾到头打印链表
*   来源:http://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
*   网址:http://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
*   网址:http://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;
}
时间: 2024-09-21 11:26:25

[剑指Offer]7.从尾到头打印链表的相关文章

剑指offer 面试题5—从尾到头打印链表

题目: 输入一个链表的头结点,从尾到头反过来打印出每个结点的值. 考虑用栈 public void invertedList1(ListNode head) { if (head == null) { return; } ListNode p = head; Stack<Integer> stack = new Stack<Integer>(); while (p != null) { stack.push(p.val); p = p.next; } while (!stack.i

【20】从尾到头打印链表

题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值 方案一:通常遍历链表是从头开始一个一个的遍历,所以如果要反过来打印链表,可以借助栈来实现 方案二:栈实现的方法就是递归,所以也可以用来递归来实现 //链表的结点 struct ListNode{ int value; ListNode *nextNode; }; //栈实现从尾到头输出 void PrintListReverse(ListNode *headNode){ if(headNode == NULL){ return; }

剑指offer系列之五十九:链表中环的入口节点

题目描述 一个链表中包含环,请找出该链表的环的入口结点. 此题的思路其实 很简单,之所以出现环,是因为在整个链表中出现了重复的节点,而遇到的第一个重复的节点就是环的入口节点.所以可以使用Set来保存遍历到的节点,因为Set集合是不允许出现重复元素的,所以当一个节点被第二次添加的时候,往Set中放元素是失败的.所以可以利用这一点找出第一个重复的元素.基于这种思路的代码比较简洁,代码如下(已被牛客AC): import java.util.HashSet; import java.util.Set;

[剑指Offer] 第3章课后题详解

[剑指Offer] 第3章课后题详解 目录 剑指Offer 第3章课后题详解 目录 大数加法 分析 解法 优化 链表的中间节点 分析 解法 环形链表 分析 解法 反转链表 分析 解法 大数加法 本题为<剑指Offer>"面试题12:打印1到最大的n位数"一节中的"相关题目". 定义一个函数,在该函数中可以实现任意两个整数的加法. 分析 由于没有限定输入两个数的大小范围,所以需要把它当做大数问题来处理.大数无法用int,long甚至long long类型来

剑指offer学习笔记1

C++的标准不允许复制构造函数传值参数.A(const A& other){},如果是传值参数,把形参复制到实参会调用复制构造函数,就会形成无休止的递归调用从而导致栈溢出. 赋值运算符函数 class CMyString { public: CMyString(char *pData = NULL); CMyString(const CMyString& str); ~CMyString(); CMyString& operator=(const CMyString& ot

剑指offer:顺时针打印矩阵

剑指offer上的第20题,九度OJ上测试通过. 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行包括两个整数m和n(1<=m,n<=1000):表示矩阵的维数为m行n列. 返回栏目页:http://www

剑指offer系列之二十六:输出字符串的全排列

题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 结果请按字母顺序输出. 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 此题与剑指offer原题存在一些初入,在原题中并没有规定字符串中字符是否有重复的出现.不过思路是一致的,只不过是添加额外的判断罢了.下面说说我的思路吧:先不考虑是否出现重读字符,要对一个字符进行全排列,可以

[剑指Offer] 第4章课后题详解

[剑指Offer] 第4章课后题详解 目录 剑指Offer 第4章课后题详解 目录 二叉树的镜像 分析 解法 拓展 判断前序遍历 分析 解法 拓展 字符的组合 分析 解答 正方体的顶点 分析 解法 8个皇后 分析 解法 二叉树的镜像 本题为<剑指Offer>"面试题19:二叉树的镜像"一节中的"本题拓展". 请完成一个函数,输入一个二叉树,该函数输出它的镜像,要求使用循环的方法,不能用递归.二叉树节点定义如下: struct BinaryTreeNode

剑指Offer之合并两个排序的链表

题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. (hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数. 下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素.接下来一行包含m个元素,s(1