【发布时间】:2010-07-07 20:35:55
【问题描述】:
我一直在试图弄清楚如何反转双向链表的顺序,但由于某种原因,在我的函数 void reverse() 中运行了一次 while 循环,然后由于某种原因而崩溃。为了回答前面的一些问题,我在兄弟们的帮助下自学。这不是全部代码,但我有一个 display() 函数,它按时间顺序从 start_ptr 打印所有节点,还有一个开关可以激活某些功能,如
case 1 : add_end(); break;
case 2 : add_begin(); break;
case 3 : add_index(); break;
case 4 : del_end(); break;
case 5 : del_begin(); break;
case 6 : reverse(); break;
这是我的代码的精髓:
#include <iostream>
using namespace std;
struct node
{
char name[20];
char profession[20];
int age;
node *nxt;
node *prv;
};
node *start_ptr = NULL;
void pswap (node *pa, node *pb)
{
node temp = *pa;
*pa = *pb;
*pb = temp;
return;
}
void reverse()
{
if(start_ptr==NULL)
{
cout << "Can't do anything" << endl;
}
else if(start_ptr->nxt==NULL)
{
return;
}
else
{
node *current = start_ptr;
node *nextone = start_ptr;
nextone=nextone->nxt->nxt;
current=current->nxt;
start_ptr->prv=start_ptr->nxt;
start_ptr->nxt=NULL;
//nextone=nextone->nxt;
while(nextone->nxt!= NULL)
{
pswap(current->nxt, current->prv);
current=nextone;
nextone=nextone->nxt;
}
start_ptr=nextone;
}
}
【问题讨论】:
-
您正在交换节点的内容,而不仅仅是节点指针。你确定要这样做吗?
-
在相关说明中,您可以从不同的角度看待事物。与其反转双向链接列表本身的内容,不如专注于反向迭代列表的内容,这应该很简单,因为列表是双向链接的。例如,为您的列表实现 STL 样式的双向迭代器。它们可以与
std::reverse_iterator<>适配器一起使用(用于rbegin()和rend())。一旦实现了这些方法,就可以很容易地利用 STL 算法,包括std::reverse()。这是一个有趣的练习,IMO。
标签: c++ linked-list reverse