单链表逆序(递归&非递归)

原创 2012年03月25日 13:54:08

结点定义:

struct Node
{
        int data;
        Node *next;
};

方法一:

设置两个临时指针pre和ne分别标记当前指针的前驱和后继,将当前结点的next指针指向前驱,然后把前驱指针和当前指针往后移动,继续遍历,当然每次移动后都要重新标记当前结点的后继结点,代码如下:

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;
	}
}

方法二:

采用递归的方式,如果要将当前结点逆序,那么先将它的后继结点都逆序,然后把逆序后的尾结点的next指向当前结点即可,要注意的是递归出口,我们选择链表为空或者只有一个结点的情况为递归出口,代码如下:

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;
	}
}

单链表的逆序基本上就是以上两种思想,当然写法可以有很多,根据自己的理解能将其实现就行了。

相关文章推荐

单链表逆序-------- 递归和循环

1、 单链表逆序          经典的“单链表逆序”问题。很多公司的面试题库中都有这道题,有的公司明确题目要求不能使用额外的节点存储空间,有的没有明确说明,但是如果面试者使用了额外的节点存储...

单链表逆序

2、 单链表逆序          第二个题目是很经典的“单链表逆序”问题。很多公司的面试题库中都有这道题,有的公司明确题目要求不能使用额外的节点存储空间,有的没有明确说明,但是如果面试者使用了...

面试题-单链表的逆序

单链表的逆序,并不难. 面试中经常会被问到, 熟悉一下.

【链表】C++链表反转、链表逆序打印

题目:C++实现链表逆序打印、链表反转 如何将链表逆序,取决于题目的要求。如果面试官只要求打印,一般不改动链表结构为好,如果要求改变链表的方向,则需要改变结构,再顺序打印。 方法1:只逆序打印,不改变...

对一个单链表进行逆序排列。

算法:当建立好一个链表后,指针的方向是固定的,从某种意义上来说只能从head开始,每一个next都是指向下一个,即从左到右,如果要逆序排列,首先很容易想到要访问到尾节点,将其当做新的头结点,然后让它去...

C++ 递归和非递归实现链表逆序

测试环境:vs2010  windows7 逆序分别采用递归调用和链表头插法实现逆序。 具体代码如下: #include #include using namespace std; class...

hadoop的伪分布式安装

hadoop安装部署的三种模式: 单机模式(本地模式):hadoop的默认配置模式,此时: 1)hadoop使用本地文件系统而非分布式文件系统(HDFS)。 2)不会启动任何hadoop守护...
  • A__17
  • A__17
  • 2016年11月27日 01:46
  • 1556

找出字符串的最长不重复子串,输出长度

这道题有O(N)的算法,具体思路如下: 以abcbef这个串为例 用一个数据结构pos记录每个元素曾出现的下标,初始为-1 从s[0]开始,pos['a'] == -1,说明a还未出现过,令pos[...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单链表逆序(递归&非递归)
举报原因:
原因补充:

(最多只允许输入30个字)