链表翻转的两种方法(递归+非递归)

来源:互联网 发布:淘宝家具安装工 编辑:程序博客网 时间:2024/04/27 14:01
          前天在论坛上看到有位同学在问链表转置的问题,下面的人不是在别的地方拷贝来的代码(还有错误),要么就是一点解释都没有

 链表定义

typedef struct node{ElemType data;struct node * next;}ChainNode;typedef struct{ChainNode *head;int size;ChainNode *tail;}List;


 

/*********************************************************总体思路就是将链表看作是两条链每次都从旧链表里面取第一个作为新链表的表头,*********************************************************/void ReserveList(List * plist)        //非递归实现,{ChainNode * phead;//新链表的头 开始的第一个节点ChainNode * pt;//旧链表的头 开始的第二个节点ChainNode * pn;//旧链表头的下一个phead = plist->head;if(phead && phead->next&& phead->next->next)//首先确定{phead = plist->head->next;//新链表就是以第一个节点开始,依次在表头添加节点,添加的节点是旧链表的第一个节点pt = phead->next;//旧链表,旧链表被取走头结点之后放入新链表的表头,pn = pt->next;phead->next = 0;while(pt){pn = pt->next;//pn是旧链表的第二个节点pt ->next = phead;//取旧链表的第一个节点插入新链表phead = pt;pt = pn;//旧链表往后移动}}plist->head->next = phead;//新链表重新赋值到整个链表}/*********************************************************递归思想,原理也是从就链表上依次取元素放入到新链表直到就链表被取完,开始的时候新链表是空的*********************************************************/ChainNode * ReserveListRe(ChainNode * oldlist,ChainNode * newlist){ChainNode * pt;pt = oldlist->next;//取旧链表的表头,pt是现在的旧链表oldlist->next = newlist;//就旧链表插入到新链表newlist = oldlist;//如果旧链表是空,表示旧链表被取完了,新链表就是翻转之后的链表return (pt == NULL) ? newlist : ReserveListRe(pt,newlist);}