从尾到头打印链表(经典面试题)

  • 从尾到头打印单链表

思路:自己画一个简单的链表有助于理解,先来分析打印一次的过程,cur 是用来遍历链表用的。就这个题来说,我么们首先要打印5,也就是当cur->next = NULL时,打印cur->data的值。第二次,要打印4,也就是当cur->next = 5。所以我们需要用一个指针记录每一趟的结尾,并且每一趟都需要从头开始,所以需要一个指针记录头的位置。下面看代码具体实现。

//链表面试题.c

#include "链表面试题.h"
#include <stdio.h>

//非递归写法
void PrintReverse(ListNode* first) {
	ListNode* end = NULL;
	while (end != first) {
		ListNode* cur = first;     //每趟循环都需要重新设定
		while (cur->next != end) {
			cur = cur->next;
		}

		//该趟的结尾
		printf("%d ", cur->data);
		end = cur;                 //将end指针指向此时的cur
	}
}


//递归写法
void PrintReverseRecursion(ListNode* first)
{
#if 0
	if (first->next == NULL) {
		printf("%d ", first->data);
	}
	//
	else {
		PrintReverseRecursion(first->next);
		printf("%d ", first->data);
	}
#endif
	//对上面写法的改进
	if (first == NULL) {
		return;
	}
	else {
		PrintReverseRecursion(first->next);
		printf("%d ", first->data);
	}


}

void TestPrintReverse()
{
	printf("非递归写法:");
	ListNode *first = NULL;
	ListPushBack(&first, 1);
	ListPushBack(&first, 2);
	ListPushBack(&first, 3);
	ListPushBack(&first, 4);
	ListPushBack(&first, 5);

	PrintReverse(first);
	printf("\n");
}

void TestPrintReverse2()
{
	printf("递归写法: ");
	ListNode *first = NULL;
	ListPushBack(&first, 1);
	ListPushBack(&first, 2);
	ListPushBack(&first, 3);
	ListPushBack(&first, 4);
	ListPushBack(&first, 5);

	PrintReverseRecursion(first);
}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值