在对单链表进行倒置时 无法输出倒置的内容
void reverseL(LinkNode *&L)
{
// 在带头结点的单链线性表L进行反转
/********** Begin **********/
LinkNode*p1,*p2,*s;
p1=L;
p2=L->next;
p1->next=NULL;
while(p2->next!=NULL)
{
s=p2->next;
p2->next=p1;
p1=p2;
p2=s;
}
你的算法看起来是对的。
不能输出的原因是:你没有把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;
}
修改如下,供参考:
void reverseL(LinkNode *&L)
{
// 在带头结点的单链线性表L进行反转
/********** Begin **********/
LinkNode*p1,*p2,*s;
//p1=L;
p2=L->next;
L->next = NULL; //p1->next=NULL;
while(p2!=NULL) //p2->next!=NULL
{
p1 = p2; //s=p2->next;
p2 = p2->next; //p2->next=p1;
p1->next = L->next; //p1=p2;
L->next = p1; //p2=s;
}
}