面试题:用一个临时变量实现单链表逆序

通常实现某种算法有两种常用的思想:循环和递归,这两种方式都需要占用一定的空间,但是循环使用的是某一个栈帧的空间,而递归则会使运行时函数调用不断压栈导致栈帧数量的增加。我在之前的动态规划算法学习中提到的爬楼梯问题所采用的两种方式可以很好地解释这两种思想。

《编程之美》3.4扩展问题实现中,使用循环的思想实现了链表的逆序,这种方式需要使用三个临时变量。那如何只使用一个临时变量实现单链表逆置呢?我们可以采用栈,将链表节点保存在栈结构中,但是这样也不符合只是用一个临时变量的要求。对比循环和递归的特点,对于变量个数要求的问题,递归可以很好地解决。

typedef struct Node
{
	int data;
	struct Node *pnext;
}Node;

Node *head;		/* head是逆序后的头结点 */
Node *reverse(Node *p)
{
	if(p == NULL || p->pnext == NULL)
	{
		head = p;
		return head;
	}
	reverse(p->pnext)->pnext = p;
	p->pnext = NULL;
	return p;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值