题目描述
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
白话题目:
没有啥的,会一些数据结构的小伙伴,都应该能玩了吧。给一个链表,反着输出形成新的链表
没学过的小伙伴,看下边。啥都有。
我来帮你解决简单问题,我就喜欢把复杂问题简单化,把简单的事情墨迹化。
算法:
(1)找到链表的头和它后面的哪一个
(2)把头摘下来,连接到新表的头(一开始啥也没有就是尾呗)
(3)这个“头”成为新表的头
直到世界的尽头。
详细解释关注 B站 【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB
C语言完全代码
#include <stdio.h>
#include <stdlib.h>
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode
{
int val;
struct ListNode *next;
} ListNode;
ListNode *ListCreate(int n)
{
ListNode *p=NULL,*head,*r;
head=NULL;
r=head;
int i=0;
//尾插法
while(i<n)
{
int x;
scanf("%d",&x);
p=(ListNode*)malloc(sizeof(ListNode));
p->val=x;
if(head==NULL) //第一个
{
head=p;
r=p;
p->next=NULL;
}
else
{
r->next=p;
r=p;
}
i++;
}
r->next=NULL;
return head;
}
void ListPrint(struct ListNode *head)
{
ListNode *p;
p=head;
while(p!=NULL)
{
printf("%d ",p->val);
p=p->next;
}
printf("\n");
}
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode *p, *pre = NULL;
while(head)
{
p = head->next;
head->next = pre;
pre = head;
head = p;
}
return pre;
}
int main()
{
int n;
scanf("%d",&n);
ListNode * list=ListCreate(n);
ListNode * result=reverseList(list);
ListPrint(result);
return 0;
}