视频讲解在这里(献丑了):
p40 第5题 王道数据结构课后代码题 c语言代码实现_哔哩哔哩_bilibili
要完成逆置
r为工作指针,p为r的后继,以防断链
循环中 r 每次都指向 L 的下一个,L 再指向 r
最后r在指向p,p继续向后遍历
一直重复这个操作即可完成单链表的逆置
本题代码如下
void nizhi(linklist* L)//单链表就地逆置
{
lnode* p = (*L)->next;
lnode* r = p;
(*L)->next = NULL;
while (p != NULL)
{
p = p->next;
r->next = (*L)->next;
(*L)->next = r;
r = p;
}
}
完整测试代码为
#include<stdio.h>
#include<stdlib.h>
typedef struct linklist
{
int data;
struct lnode* next;
}lnode,*linklist;
int n = 5;
int a[5] = { 1,2,3,4,5 };
void buildlinklist(linklist* L)//建立单链表
{
*L = (lnode*)malloc(sizeof(lnode));
(*L)->next = NULL;
lnode* s = *L, * r = *L;
int i = 0;
for (i = 0; i < n; i++)
{
s = (lnode*)malloc(sizeof(lnode));
s->data = a[i];
s->next = r->next;
r->next = s;
r = s;
}
r->next = NULL;
}
void nizhi(linklist* L)//单链表就地逆置
{
lnode* p = (*L)->next;
lnode* r = p;
(*L)->next = NULL;
while (p != NULL)
{
p = p->next;
r->next = (*L)->next;
(*L)->next = r;
r = p;
}
}
void print(linklist* L)//输出单链表
{
lnode* q = (*L)->next;
while (q != NULL)
{
printf("%d ", q->data);
q = q->next;
}
}
int main()
{
linklist L;
buildlinklist(&L);
printf("原始的单链表为:");
print(&L);
nizhi(&L);
printf("\n逆置后的单链表为:");
print(&L);
return 0;
}