C++ 反向链表

C++ 反向链表,c++,C++,我正在实现一个带有指针的链表。 我需要反转链表,所以我写了rotate(list&l) 但是我没有得到我期望的结果。 因为输入是 0123456789 我希望 987654210 结果,我得到了 0987654321 既然我找不到我做错了什么,你能指出什么是错的吗? 问题似乎从这里开始:(旋转) 我发现第一个节点是最后一个节点(因为cout d;给出的是0而不是9) #包括 使用名称空间std; typedef类节点*列表; 结构节点{ int d; 下一个列表; }; //更新:已重命名 无效

我正在实现一个带有指针的链表。
我需要反转链表,所以我写了rotate(list&l)
但是我没有得到我期望的结果。
因为输入是
0123456789
我希望
987654210
结果,我得到了
0987654321

既然我找不到我做错了什么,你能指出什么是错的吗? 问题似乎从这里开始:(旋转)

我发现第一个节点是最后一个节点(因为cout d;给出的是0而不是9)

#包括
使用名称空间std;
typedef类节点*列表;
结构节点{
int d;
下一个列表;
};
//更新:已重命名
无效反向(列表和列表){
/*
开始:
a、b、c、d、e
b c d e**a**
c d e**b**a
d e**c**b a
结果:
e**d**c b a
*/
//获取最后一个节点
列表结束=l;
while(结束->下一步!=0){
结束=结束->下一步;
}
//直接在原始最后一个节点后插入第一个节点
while(l!=结束){
列表hulp=l;
l=hulp->next;
hulp->next=结束->下一步;
结束->下一步=hulp;
}
}
int main(){
列表l=新节点();
int i=0;
列表k=l;
而(i<10)
{
k->d=i;
k->next=新节点();
k=k->next;
i++;
}
列表m=l;
while(m->next!=0)
{
下一步;
}
反面(l);
m=l;
while(m->next!=0)
{
下一步;
}
}

这不是迭代链表的典型方式:

while (m->next != 0) {
    cout << m->d << endl;
    m = m->next;
}
然后,打印逻辑将其打印为:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9
然后,您的反向操作可能会正常运行,并生成以下列表:

0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
您打印为:

0, 9, 8, 7, 6, 5, 4, 3, 2, 1 

这不是遍历链表的典型方式:

while (m->next != 0) {
    cout << m->d << endl;
    m = m->next;
}
然后,打印逻辑将其打印为:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9
然后,您的反向操作可能会正常运行,并生成以下列表:

0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
您打印为:

0, 9, 8, 7, 6, 5, 4, 3, 2, 1 

您错误地初始化了列表。d=9的最后一个节点,它应该有一个空的
next
,但实际上它有一个
新节点
。要解决此问题,请将列表初始化更改为:

for (int i = 0; ; ++i)
{
    k->d = i;
    if (i >= 9) {
        break;
    }
    k->next = new Node();
    k = k->next; 
}
更改后,还需要更改初始和最终打印(否则将不打印最后一个节点)。打印代码应为(最好将其放入打印功能中,以避免重复代码):

(;m;m=m->next)的

{

您可能错误地初始化了列表。d=9的最后一个节点应该有一个空的
next
,但实际上它有一个
新节点
。若要修复此问题,请将列表初始化更改为:

for (int i = 0; ; ++i)
{
    k->d = i;
    if (i >= 9) {
        break;
    }
    k->next = new Node();
    k = k->next; 
}
更改后,还需要更改初始和最终打印(否则不会打印最后一个节点)。打印代码应为(最好将其放入打印功能中,以避免重复代码):

(;m;m=m->next)的

{

你能反转链表还是旋转链表?我正在反转链表,很抱歉名称不对。另外,我不理解你在评论中描述的启动“开始:”的步骤。对我来说,一个名为
rotate
的函数“反转”列表令人困惑。我建议将名称更改为
reverse
@chris为什么不能重用已分配的内存?如果它已经是
new
d,则您的程序将拥有它,只要它希望保留它。您是在反转链接列表还是旋转它?我正在反转它,也很抱歉名称错误,我不理解其中的步骤您在注释中描述了启动“start:”。对我来说,一个名为
rotate
的函数“反转”列表令人困惑。我建议将名称更改为
reverse
@chris为什么不能重用已分配的内存?如果它已经是
新的
d,那么只要它希望保留它,你的程序就拥有它。好吧,这两个错误花费了我相当多的时间,但至少我现在理解了它为什么不起作用。非常感谢!好吧,这些错误两个错误花了我不少时间,但至少我现在明白为什么它不起作用了。非常感谢!我现在明白我的错误了,谢谢!我现在明白我的错误了,谢谢!