我正在学习链表,并正在做一道题,要求你反转一个双向链表.我的代码运行得很好,但我不知道是怎么回事.您可以忽略除reverse_list
函数以外的所有内容.如您所见,在while
循环中,条件是ptr->next != NULL
.这种情况应该不会让我到达最后一个 node ,直到最后一个操作ptr = ptr->prev
,这意味着在最后一个 node 中不应该执行while
循环中的其他操作.
这样,逻辑ptr->prev
必须仍然指向倒数第二个 node (或者您可以在反转后指向第二个 node ),而它应该是NULL
.我不明白为什么即使它没有被适当地颠倒,它也给出了正确的答案.
// reverse a double linked list
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
struct node *prev;
int data;
struct node *next;
} st;
void print(st *head)
{
while (head)
{
printf("%d ", head->data);
head = head->next;
}
}
void add_node(st *head, int data)
{
st *ptr = malloc(sizeof(st));
ptr->data = data;
ptr->next = NULL;
while (head->next)
{
head = head->next;
}
head->next = ptr;
}
st *reverse_list(st *head)
{
st *ptr = head->next;
head->next = NULL;
while (ptr->next != NULL)
{
head->prev = ptr;
ptr->prev =ptr->next;
ptr->next = head;
head = ptr;
ptr = ptr->prev;
}
ptr->next = head;;
head = ptr;
return head;
}
int main()
{
st *head = malloc(sizeof(st));
head->prev = NULL;
head->data = 12;
head->next = NULL;
add_node(head, 22);
add_node(head, 1);
add_node(head, 24);
add_node(head, 45);
printf("before reverse\n");
print(head);
head = reverse_list(head);
printf("\nafter reverse\n");
print(head);
return 0;
}
// here is the output
before reverse
12 22 1 24 45
after reverse
45 24 1 22 12