你的算法看起来是对的。
不能输出的原因是:你没有把p1赋值给L,导致反转后L就是最后一个节点。最后加一个 L = p1就行了。
但是while(p2->next !=NULL)这个地方有个缺陷,链表只有一个节点时,p2初始值就为空,会导致程序挂掉。下面是我写的测试代码,试过没问题。
#include <stdio.h>
struct LinkNode
{
int value;
LinkNode* next;
};
void reverse(LinkNode*& L)
{
//p1指向反转后的链表头
//p2指向还未进行反转的链表头
//反转的算法就是:从p2的头上取一个节点,放到p1的前面,直到p2的尾部
LinkNode* p1, * p2;
p1 = L;
p2 = L->next;
p1->next = nullptr;
while (p2)
{
LinkNode* temp = p2;
p2 = p2->next;
temp->next = p1;
p1 = temp;
}
L = p1;
}
int main()
{
//构建一个链表
LinkNode node1,node2,node3;
node1.next = &node2;
node2.next = &node3;
node3.next = nullptr;
node1.value = 1;
node2.value = 2;
node3.value = 3;
LinkNode* head = &node1;
printf("before reverse:");
for (LinkNode* p = head; p != nullptr; p = p->next)
{
printf("%d ", p->value);
}
printf("\n");
reverse(head);
printf("after reverse:");
for (LinkNode* p = head; p != nullptr; p = p->next)
{
printf("%d ", p->value);
}
printf("\n");
return 0;
}