题目描述
本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头。链表结点定义如下:
struct ListNode
{
int data;
struct ListNode *next;
};
函数接口定义:
struct ListNode *reverse( struct ListNode *head );
其中head是用户传入的链表的头指针;
函数reverse将链表head逆置,并返回结果链表的头指针。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *createlist(); /*裁判实现,细节不表*/
struct ListNode *reverse( struct ListNode *head );
void printlist( struct ListNode *head )
{
struct ListNode *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *head;
head = createlist();
head = reverse(head);
printlist(head);
return 0;
}
/* 你的代码将被嵌在这里 */
样例输入
1 2 3 4 5 6 -1
样例输出
6 5 4 3 2 1
代码展示(注释有一丢丢思路)
逆置链表可以用头插法(不知道的可以去查一下哦)
struct ListNode* reverse(struct ListNode* head)//要求写的函数
{
//创建三个结构体指针,*prev,*current,*next。
struct ListNode* prev = NULL;
struct ListNode* current = head;//把current初始化为头结点。
struct ListNode* next2 = NULL;
while (current != NULL)
{
//防止current指向后面的那个结点丢失,先把next赋值为current后面的那个结点
next2 = current->next;
//再把current后面的那个next赋值为prev,
current->next = prev;
//再把prev赋值为current赋值前的值
prev = current;
//此时current赋值为原来他后面的那个结点,方便下一次循环使用
current = next2;
}
//循环结束后,prev会变成链表的头节点
head = prev;
return head;
}
如果还是不太懂的话,那我就用我那憋足的画画技术给你们画一下流程吧

下一步

下一个循环

后面的循环就是结点3的next连到结点2,最后结点4的next连到结点3

(尽力了QWQ)

(画图太难了,还不怎么会用这个画图)如果还没有懂建议在纸上自己画一下流程,这样比较好理解一点
如果真的真的理解不了,先背一下这种方法吧
第一次写,可能很乱,讲的一坨答辩,谅解一下,哪里有说错的麻烦指出一下,谢谢!!!!!!
本文介绍了如何使用头插法实现单向链表的逆置,通过prev、current和next指针的交换操作,最终将链表表头变为表尾。
2256





