链表翻转的两种方法(递归+非递归)
来源:互联网 发布:淘宝家具安装工 编辑:程序博客网 时间: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);}
- 链表翻转的两种方法(递归+非递归)
- 单链表递归和非递归两种翻转方法(手写链表)
- 用递归和非递归两种方法翻转一个链表
- 用递归和非递归两种方法翻转一个链表
- 链表翻转的递归和非递归算法
- 链表翻转的递归和非递归实现
- 二分查找(递归和非递归两种方法)
- 两种版本的二分搜索(递归+非递归)
- 两种方法(递归,非递归)实现单链表的逆转
- 链表翻转非递归实现
- 翻转二叉树(递归非递归)
- 二叉树先序遍历非递归方法的两种实现
- 非递归求解汉诺塔的两种方法
- 递归/非递归 两种方法自动创建多级目录
- 二分求幂—递归非递归两种方法
- 二分查找(递归与非递归两种方法实现)
- 两种方法求n!,递归和非递归调用
- leetcode系列(14)链表翻转(递归与非递归)
- Windows系统编程(五):Windows内存
- 操作系统真实的虚拟内存是什么样的(一)
- 常见jsp出现的页面错误(404,500等)与捕捉办法
- elua跑起来了
- Fusioncharts 参数
- 链表翻转的两种方法(递归+非递归)
- 元数据- DataBaseMetaData
- linux下git工具使用 和 Git 中文教程
- 短信ui-会话编辑界面(二)接收者UI
- 简单的html+ajax+ashx登陆
- RAMDISK文件系统的制作
- PHP学习 --cookie
- Annotation 中的一些属性意义
- C inline