我之前已经知道有关反转链接列表的问题,但我想尝试用我自己的实现来解决这个问题。
我的代码对我有意义,我觉得它应该可行但是当我运行调试器时,循环无限运行。具体而言,head
和next
在链表的第一个和第二个节点之间保持交替。 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);
}
}
答案 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)
的列表的头部。因此,在您下一次循环时,head
和next
都会指向原始头节点!
如果你改变:
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)
您的算法存在两个问题:
列表中的head元素将成为反转列表中的最后一个元素,因此您需要将其链接设置为NULL。
在循环的第一次迭代中,您将第二项中的链接更改为指向第一项,但是您没有将next
指针前进到下一项(在这种情况下为第三个元素) )。