反向链接列表

时间:2013-01-25 01:16:41

标签: c++

我正在使用指针实现链接列表 我需要反转链表,所以我写了旋转(List& l)
但我没有得到我期望的结果 由于输入是
0 1 2 3 4 5 6 7 8 9
我希望有 9 8 7 6 5 4 3 2 1 0
结果,但我得到了 0 9 8 7 6 5 4 3 2 1

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

while(end->next !=0){
       end = end->next;
    }

我到达那里,第一个节点是最后一个节点(因为cout<< end-> d;给出me0而不是9)

#include<iostream>

using namespace std;

typedef class Node *List;
struct Node{ 
    int d;
    List next;
};
//update : renamed
void reverse(List &l){
/*
start :
a b c d e

b c d e **a**
c d e **b** a
d e **c** b a
Result:
e **d** c b a
    */

    // get last node
    List end = l;
    while(end->next !=0){
       end = end->next;
    }
    //insert first node directly after the original last node
    while(l!=end){
        List hulp = l;
        l = hulp->next;
        hulp->next = end->next;
        end->next=hulp;
    }
}
int main(){
    List l = new Node();
    int i = 0;
    List k = l;
    while (i < 10)
    {
        k->d = i;
        k->next = new Node();
        k = k->next; 
        i++;
    }
    List m = l;
    while ( m->next !=0 )
    {
        cout << m->d << endl;
        m = m->next;
    }
    reverse(l);
     m = l;
    while ( m->next !=0 )
    {
        cout << m->d << endl;
        m = m->next;
    }
}

2 个答案:

答案 0 :(得分:3)

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

while (m->next != 0) {
    cout << m->d << endl;
    m = m->next;
}

相反,你应该这样做:

while (m != 0) {
    cout << m->d << endl;
    m = m->next;
}

如果你这样做,你会看到你最初创建的链表实际上是:

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

然后您的打印逻辑将其打印为:

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 

答案 1 :(得分:1)

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

for (int i = 0; ; ++i)
{
    k->d = i;
    if (i >= 9) {
        break;
    }
    k->next = new Node();
    k = k->next; 
}

更改后,您还需要更改初始AND最终打印(否则您将无法打印最后一个节点)。打印代码应该是(您最好将其放入打印功能以避免重复代码):

for ( ; m; m = m->next)
{
    cout << m->d << endl;
}