打印列表从尾部到头部

题目描写叙述:

输入一个链表,从尾到头打印链表每一个节点的值。

输入:

每一个输入文件仅包括一组測试例子。


每一组測试案例包括多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类推。

当输入到-1时代表链表输入完成。-1本身不属于链表。

输出:

相应每一个測试案例,以从尾到头的顺序输出链表每一个节点的值。每一个值占一行。

例子输入:
1
2
3
4
5
-1
例子输出:
5
4
3
2
1
 
解法一:
1.遍历链表,使用栈结构来存储链表元素。
2.链表出栈即从尾到头打印链表。

代码:

/********************************************
从尾到头打印链表
by Rowandjj
2014/7/18
********************************************/
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct _NODE_//单链表结点定义
{
	int data;
	struct _NODE_ *next;
}Node,*pNode;
typedef struct _STACK_//栈结构
{
	pNode head;
	int size;
}Stack,*pStack;
void InitStack(pStack stack)
{
	pNode pNew = (Node*)malloc(sizeof(Node));
	if(!pNew)
	{
		return;
	}
	pNew->next = NULL;
	stack->head = pNew;
	stack->size = 0;
}
void Push(pStack stack,int data)
{
	pNode pNew = (Node*)malloc(sizeof(Node));
	if(!pNew)
	{
		return;
	}
	pNew->data = data;
	pNew->next = stack->head->next;
	stack->head->next = pNew;
	stack->size++;
}
int pop(pStack stack)
{
	if(stack->size == 0)
	{
		return -1;
	}
	pNode pDel = stack->head->next;
	stack->head->next = pDel->next;
	int data = pDel->data;
	free(pDel);
	return data;
}
void ReversePrint(pNode phead)
{
	Stack s;
	InitStack(&s);
	if(phead == NULL)
	{
		return;
	}
	pNode p = phead;
	while(p != NULL)
	{
		Push(&s,p->data);
		p = p->next;
	}
	int num = s.size;
	for(int i =0; i < num; i++)
	{
		printf("%d\n",pop(&s));
	}
}
int main()
{
	int data;
	scanf("%d",&data);
	if(data == -1)
	{
		exit(-1);
	}
	pNode pHead = (Node*)malloc(sizeof(Node));
	if(!pHead)
	{
		exit(-1);
	}
	pHead->data = data;
	pHead->next = NULL;
	pNode p = pHead;
	while(scanf("%d",&data))
	{
		if(data == -1)
		{
			break;
		}
		pNode pTemp = (Node*)malloc(sizeof(Node));
		if(!pTemp)
		{
			exit(-1);
		}
		pTemp->data = data;
		pTemp->next = NULL;
		p->next = pTemp;
		p = pTemp;
	}
	ReversePrint(pHead);
	return 0;
}

解法2:
递归就是简单啊。!
#include<stdlib.h>
#include<stdio.h>
typedef struct _NODE_
{
	int data;
	struct _NODE_ *next;
}Node,*pNode;
//递归 从后往前遍历链表
void Reverse(pNode pHead)
{
	if(pHead == NULL)
	{
		return;
	}
	if(pHead->next != NULL)
	{
		Reverse(pHead->next);
	}
	printf("%d\n",pHead->data);
}
int main()
{
	pNode pHead;
	int data;
	scanf("%d",&data);
	if(data == -1)
	{
		exit(-1);
	}
	pHead = (pNode)malloc(sizeof(Node));
	if(!pHead)
	{
		exit(-1);
	}
	pHead->data = data;
	pHead->next = NULL;
	pNode p = pHead;
	while(scanf("%d",&data) != -1)
	{
		if(data == -1)
		{
			break;
		}
		pNode pNew = (pNode)malloc(sizeof(Node));
		if(!pNew)
		{
			exit(-1);
		}
		pNew->data = data;
		pNew->next = NULL;
		p->next = pNew;
		p = pNew;
	}
	Reverse(pHead);
	//销毁
	pNode pt = pHead,q;
	while(pt)
	{
		q = pt->next;
		free(pt);
		pt = q;
	}
	return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值