pointer 2 单链表逆序

链表 节点结构

<span style="font-size:18px;">struct entry{
  string name,phone;
  entry* next;
};</span>


反向函数: 迭代

/*迭代 将链表反向
  需要三个变量 
  head正向链表的头地址(还未反向)
  store 记录反向链表的首地址
  temp 存储 从正向链表取出来的第一个节点
*/
entry *reverse(entry * head){
	entry* temp; 
	entry* store=NULL;
	while(true){
		if(head==NULL)break;
		temp=head;//将 正向链表的第一个及诶单存储 放在临时变量temp上
		head=head->next;//将正向的第一个节点取出来  
		temp->next=store;//临时变量挂在反向链表的头上
		store=temp;//将反向头前移
	}
	return store;//返回反向列表的头结点
}

反向链表:递归

递归真的很精妙:  因为递归有一个回溯的过程,而这个过程恰好模拟了 链表的反向遍历,所以操作更加方便。

分析递归 有几个要素

1.递归函数间传递的是什么,比如八皇后就传递方案是否可行,而这里就传递 反向链表的首地址,也就是正向最后一个节点的地址。

2.在每一个递归函数中信息的多少: 比如这里 有当前节点信息,有存储下一个节点的信息,而我们要做的就是将指向反过来

entry * curr;//当前地址
curr->next->next=curr;//增加 后一个节点向当前节点的一个指向
curr->next=NULL;//删除当前节点向后一个节点的指向
//这两句话 将指向反过来了
这个过程一定是在回溯的过程中完成的 所以实在调用递归函数之后。

总代码:

entry* reverseOri(entry *  thisnode){
	entry * newOne;

	if(thisnode==NULL|thisnode->next==NULL)return thisnode;
	
	newOne=reverseOri(thisnode->next);
	
	thisnode->next->next=thisnode;
	thisnode->next=NULL;
	
	return newOne;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值