单链表逆序(递归&非递归)
2014-04-21 17:21
309 查看
结点定义:
[cpp]view plaincopy
struct Node
{
int data;
Node *next;
};
方法一:
设置两个临时指针pre和ne分别标记当前指针的前驱和后继,将当前结点的next指针指向前驱,然后把前驱指针和当前指针往后移动,继续遍历,当然每次移动后都要重新标记当前结点的后继结点,代码如下:[cpp]
view plaincopy
<span style="font-size:18px;">void reverse(list *&head)
{
if(list == NULL)
{
return ;
}
else
{
list *pre = head;
list *cur = head->next;
list *ne;
while(cur != NULL)
{
ne = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
head->next = NULL;
head = pre;
}
}</span>
方法二:
采用递归的方式,如果要将当前结点逆序,那么先将它的后继结点都逆序,然后把逆序后的尾结点的next指向当前结点即可,要注意的是递归出口,我们选择链表为空或者只有一个结点的情况为递归出口,代码如下:[cpp]
view plaincopy
<span style="font-size:18px;">list *reverse(list *p, list *&head)
{
if(p == NULL || p->next == NULL)
{
head = p;
return p;
}
else
{
list *temp = reverse(p->next, head);
temp->next = p;
return p;
}
}</span>
单链表的逆序基本上就是以上两种思想,当然写法可以有很多,根据自己的理解能将其实现就行了。
相关文章推荐
- 单链表逆序(递归&非递归)
- 单链表逆序-------- 递归和循环
- 合法IP&窗口最大值数组&打印素数&递归逆序一个栈&栈排序另一个栈&MyString&寻找数组中出现的重复字符&数组中的重复数字&逆序打印链表&空格替换成%20
- 简单的单链表<实现单链表的增删查改逆序和寻找中间节点>
- 单链表的逆序(循环与递归)
- 采用递归逆序打印单链表(递归出口的三种写法)
- 程序员面试100题(算法)之递归逆序打印单链表、字符串(同时求字符串长度)
- 算法设计和数据结构学习_(单链表的递归逆序)
- 单链表的递归逆序
- 二.从零写单链表的算法之遍历节点&删除节点&逆序节点
- 【Leetcode】145. Binary Tree Postorder Traversal 【递归&&非递归】
- 单链表(创建<14种功能>,逆序,合并)
- 二分查找算法----递归&&非递归
- 算法设计和数据结构学习_8(单链表的递归逆序)
- 【数据结构】快排 【递归&&非递归】
- 求n的阶乘(递归&&非递归),Fibonacci函数,二分法查找,汉诺塔实现,排列组合,整数划分,一元多项式的加减乘
- 链表面试题--两种方法逆序打印单链表(栈和递归)
- 总结: 求逆序对 递归分治(与poj 22…
- 算法设计和数据结构学习_6(单链表的递归逆序)
- 链表逆序(递归&非递归)/倒序输出链表值/用一个递增序列构建平衡二叉搜索树/用递归的方法判断数组是不是升(降)序排列