利用尾递归做链表倒置题

24 篇文章 1 订阅
5 篇文章 0 订阅

    看到又一次知乎轮子哥说有次面试面到一个人说不出链表倒置(反转)的办法,觉得这个人的计算机底蕴不行没有招。所以自己用尾递归写一个试试,感觉挺好玩的。

    先上流程图:

    

     其实就是做一个函数,取相邻的两个结点,还有第二个结点的下一个的值,就可以将这两个结点进行翻转。执行完之后,再把第二个结点和刚刚保留的第二个结点的下一个结点。分别再输入到函数的第一个结点,和第二个结点中,反复操作到第二个结点无法得到下一个结点之后不再递归。即可把整个链表进行翻转

     代码如下:

#include "stdio.h"
#include "stdlib.h"

typedef struct node node;
struct node{
	void* valAddress;
	node *next;
};

/**创建一个链表(存储50个数 0~49)**/
node* createList(){
	int i, max = 50;
	node *head = NULL; 
	node *cursor = NULL;
	for(i=0; i < max; i++){
		if(cursor == NULL){
			/*第一个结点的内存分配,并记录这个地址到head以防搞丢*/
			cursor = (node*) malloc(sizeof(node));
			head = cursor;
		} else{
			/*为下一个结点分内存,移动游标到下一个结点*/
			cursor->next = (node*) malloc(sizeof(node));
			cursor = cursor->next;
		}
		/*给内容指针变量赋分配好空间的内存首地址,并转换指针为合适类型然后给内存区赋值*/
		cursor->valAddress = (int*) malloc(sizeof(int));
		*((int*)(cursor->valAddress)) = i;
	}
	cursor->next = NULL;
	return head;
}

/**遍历一个表**/
void readList(node* cursor){
	while(cursor != NULL){
		printf("%d\t", *((int*)(cursor->valAddress)));
		cursor = cursor->next;
	}
	printf("\n");
}

/**结点间上下指向关系更改函数(用尾递归)**/
node* turn(node* first, node* sec){
	node* secBeforeNext = sec->next;
	sec->next = first;
	if(secBeforeNext == NULL) return sec;
	turn(sec, secBeforeNext);
}

/**链表倒置**/
node* turnAround(node* head){
	return turn(NULL, head);
}

int main(){
	node *list = createList();	
	node *newHead = NULL;
	readList(list);
	printf("开始链表倒置\n");
	list = turnAround(list);
	readList(list);
	printf("开始链表倒置\n");
	newHead = turnAround(list);
	readList(newHead);
	return 0;
}

运行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值