从尾到头打印链表

问题:输入一个链表,返回一个反序的链表

基本思路:

通常,这种情况下,我们不希望修改原链表的结构。返回一个反序的链表,这就是经典的“后进先出”,我们可以使用栈实现这种顺序。每经过一个结点的时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出结点的值,给一个新的链表结构,这样链表就实现了反转。

#include <vector>
#include <list>
#include <stack>
#include <iostream>
#include <stdio.h>

using namespace std;


struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
		val(x), next(NULL)
	{
	}
};

class Solution {

public:
	vector<int> printlistFromTailToHead(ListNode* head) {
		stack<int> nodes;
		vector<int> result;
		ListNode* node = head;
		while (node != NULL) {
			nodes.push(node->val);
			node = node->next;
		}

		while (!nodes.empty()) {

			result.push_back(nodes.top());
			nodes.pop();
		}

		return result;
	}
}

上面只编写了链表的反转方法,测试方法正确性需要增加链表初始化:

class Solution {

public:
	vector<int> printlistFromTailToHead(ListNode* head) {
		stack<int> nodes;
		vector<int> result;
		ListNode* node = head;
		while (node != NULL) {
			nodes.push(node->val);
			node = node->next;
		}

		while (!nodes.empty()) {

			result.push_back(nodes.top());
			nodes.pop();
		}

		return result;
	}

	ListNode* initializeNodeList(vector<int> &input) {

		ListNode *node =(ListNode*)malloc(sizeof(ListNode)*input.size());

		for(int i = 0;i<input.size();i++)
		{

			int j = input[i];
			ListNode temp(j);
			if(i<input.size()-1)
				temp.next = &node[i + 1];

			node[i] = temp;
		}

		return node;
	}


};

最后在main跑起来:

void main()
{
	Solution A;
	ListNode *B;
	vector<int> C;
	vector<int> b{ 1,2,3,4,5,6,7,8};
	B = A.initializeNodeList(b);
	C = A.printlistFromTailToHead(B);
	for (int i = 0; i < C.size(); i++)
	{
		cout << C[i]<<endl;
	}
	int p;
	cin >> p;
}

打印结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值