gpt4 book ai didi

c - 从尾到头反转双向链表

转载 作者:太空宇宙 更新时间:2023-11-04 01:23:00 26 4
gpt4 key购买 nike

我目前正在放假练习指针,下面我写了反转双向链表的方法,但是当我把它交到在线测试中时,它失败了。

Node* Reverse(Node *head)
{
int count = 0;
struct Node *ptr = head;

// return head if NULL
if (head == NULL) {
return head;
}
// if the list is only the head, then the reverse is just the head... so nothing changes
if((head->next == NULL && head->prev == NULL)){
return head;
}

//Come here if previous if statements fail, traverse the list until I reach tail which will become the
// new head
while(ptr->next != NULL){
ptr = ptr->next;
count++;
}
head = ptr; // this is the new head
//starting from tail all the way to head swap the "prev" and "next" of each node
struct Node *temp = ptr->next;

for(int i = 0; i<count; i++){
ptr->next = ptr->prev;
ptr->prev = temp;
ptr=ptr->next;
temp= ptr->next;
//count--;
}

return head;
}

我意识到在从头到尾遍历列表时将列表反转可能更聪明,但我认为这很无聊,所以我决定从尾到头反转它。我怀疑我的 while 循环或 for 循环中有明显的错误,但我无法诊断错误。

最佳答案

我认为错误在这里:

while(ptr->next != NULL){
ptr = ptr->next;
count++;
}

假设您的链表中有 2 个元素。然后 while 循环只会迭代一次,count 将为 1。当你进入 for 循环时,它也只会迭代一次,这意味着您将正确地重新分配新头的指针,而不是第二个元素(以前的头)。

如果将 count 初始化为 1 而不是 0,它应该正确反射(reflect)链表中元素的数量,并且 for 循环应该正确执行。

编辑:您还必须稍微重构您的 for 循环,以避免在列表末尾出现段错误:

Node* temp;

for (int i = 0; i < count; i++)
{
temp = ptr->next;
ptr->next = ptr->prev;
ptr->prev = temp;
ptr = ptr->next;
}

关于c - 从尾到头反转双向链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36929205/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com