链表 节点结构
<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;
}