输入一个链表的头结点,从尾到头反过来打印出每个节点的值

Posted wanglelelihuanhuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了输入一个链表的头结点,从尾到头反过来打印出每个节点的值相关的知识,希望对你有一定的参考价值。

可以通过递归或非递归实现从尾到头打印链表。

非递归采用栈来实现,因为栈是“先进后出”,每遍历一个节点的时候,把该节点压入栈中,当遍历完整个链表后,再从栈顶逐个输出节点的值,即出栈。这样输出的节点的顺序已经反过来了。

void PrintfTailToHead()
	
		stack<ListNode<T>* > nodes;
		ListNode<T>* head = _head;
		//遍历每一个节点 入栈
		while (head != NULL)
		
			nodes.push(head);
			head = head->_next;
		
		//从栈顶输出每个节点的值 出栈
		while (!nodes.empty())
		
			head = nodes.top();//获取栈顶元素
			cout << head->_data << " ";
			nodes.pop();
		
		cout << endl;
	


递归:先递归输出后面的节点,再输出该节点本身

void PrintfTailToHead_R()
	
		_PrintfTailToHead(_head);
		cout << endl;
	

void _PrintfTailToHead(ListNode<T>* head)
	
		if (head != NULL)
		
			if (head->_next)
			
				_PrintfTailToHead(head->_next);
			
			cout << head->_data << " ";
		
	

完整代码如下:

#include<iostream>
#include<stack>
#include<assert.h>
using namespace std;

template<class T>
struct ListNode
	
	int _data;
	ListNode<T>* _next;

	ListNode<T>(const T& data)
		: _data(data)
		, _next(NULL)
	
;
template<class T>
class List

public:
	List()
		:_head(NULL)
	
	List(const T& list)
		:_head(NULL)
	
	
	~List()
	
	void PushBack(const T& x)
	
		if (_head == NULL)
		
			_head = new ListNode<T>(x);
		
		else
		
			ListNode<T>* head = _head;
			while (head->_next)
			
				head = head->_next;
			
			head->_next = new ListNode<T>(x);
		
	
	void PrintfTailToHead()
	
		stack<ListNode<T>* > nodes;
		ListNode<T>* head = _head;
		//遍历每一个节点 入栈
		while (head != NULL)
		
			nodes.push(head);
			head = head->_next;
		
		//从栈顶输出每个节点的值 出栈
		while (!nodes.empty())
		
			head = nodes.top();//获取栈顶元素
			cout << head->_data << " ";
			nodes.pop();
		
		cout << endl;
	
	void PrintfTailToHead_R()
	
		_PrintfTailToHead(_head);
		cout << endl;
	
public:
	void Printf()
	
		if (_head == NULL)
			return;
		
		while (_head)
		
			cout << _head->_data << " ";
			_head = _head->_next;
		
		cout << endl;
	
	void _PrintfTailToHead(ListNode<T>* head)
	
		if (head != NULL)
		
			if (head->_next)
			
				_PrintfTailToHead(head->_next);
			
			cout << head->_data << " ";
		
	
private:
	ListNode<T>* _head;
;
int main()

	List<int> list;
	list.PushBack(1);
	list.PushBack(2);
	list.PushBack(3);
	
	list.PrintfTailToHead_R();
	list.PrintfTailToHead();
	list.Printf();
	return 0;



 

以上是关于输入一个链表的头结点,从尾到头反过来打印出每个节点的值的主要内容,如果未能解决你的问题,请参考以下文章

从尾到头打印链表

从尾到头打印链表

剑指offer 面试题6.从尾到头打印链表

剑指 Offer 06. 从尾到头打印链表

[剑指offer]面试题5:从尾到头打印链表

在不改变链表的情况下从尾到头打印连表