您的位置:首页 > 其它

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

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>

单链表的逆序基本上就是以上两种思想,当然写法可以有很多,根据自己的理解能将其实现就行了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐