c ++链表反转 - 指针不前进

时间:2011-12-16 06:31:43

标签: c++ linked-list

我之前已经知道有关反转链接列表的问题,但我想尝试用我自己的实现来解决这个问题。

我的代码对我有意义,我觉得它应该可行但是当我运行调试器时,循环无限运行。具体而言,headnext在链表的第一个和第二个节点之间保持交替。 getLink()方法返回节点的指针(指向列表中的下一个节点)。基于我在while循环中的注释的任何输入都会有所帮助。

void revNodes(IntNodePtr& head)
{
    IntNodePtr prev = NULL;
    IntNodePtr next = NULL;
    next = head;
    while (next != NULL)
    {
        prev = head;
        // this should advance the pointer head to the next node in the list because next is the same as head initially
        head = next->getLink();
        // advance the pointer next to node after it
        next = next->getLink();
        // set the pointer in the node that head is pointing to to prev (head before head was advanced)
        head->setLink(prev);
    }
}

3 个答案:

答案 0 :(得分:0)

这个怎么样:

void revNodes(IntNodePtr&head)
{
    IntNodePtr prev = NULL;
    IntNodePtr next = NULL;
    IntNodePtr p = head;
    while (p){
        next = p->getLink();
        p->setLink(prev);
        prev = p;
        p = next;
    }
    head = prev;
}

答案 1 :(得分:0)

您将next初始化为head,然后在循环内部将其设置为指向相同节点。

实际上,它们都指向列表头部之后的第一个节点,然后您将该节点上的指针设置为具有行head->setLink(prev)的列表的头部。因此,在您下一次循环时,headnext都会指向原始头节点!

如果你改变:

next = next->getLink();

为:

next = head->getLink();

您可以在列表中前进,,然后在将head设置为next->getLink()时跳转下一个节点。因此,在开始时,您应该将next初始化为head->getLink(),将head设置为循环内的next,将next设置为head->getLink(),如上所述。

将其转化为代码:

void revNodes(IntNodePtr& head)
{
    IntNodePtr prev = NULL;
    IntNodePtr next = NULL;
    next = head->getLink();
    while (next != NULL)
    {
        prev = head;
        // this should advance the pointer head to the next node in the list
        head = next;
        // advance the pointer next to node after it
        next = next->getLink();
        // set the pointer in the node that head is pointing to to prev (head before head was advanced)
        head->setLink(prev);
    }
}

答案 2 :(得分:0)

您的算法存在两个问题:

  1. 列表中的head元素将成为反转列表中的最后一个元素,因此您需要将其链接设置为NULL。

  2. 在循环的第一次迭代中,您将第二项中的链接更改为指向第一项,但是您没有将next指针前进到下一项(在这种情况下为第三个元素) )。