C语言——反转链表

    大家好,本人第一次发布博客,目前正在学习数据结构,写博客的目的是一是想分享自己的学习过程,二也是每次写完代码后进行总结。希望大家一起共同学习!

    现在我正在看《大话数据结构》这本书,每次学习过后我都会去做一些与我看书内容相关的题目以此来巩固本次学习。

    链表就是我学习的第一课,今天我分享的是有关反转链表的代码。

    链表,其实我认为是在发现数组的不足之后进一步改进的,数组的定义大家应该都知道,那不就是一个数据一个数据顺序排嘛,但数组有个缺点,就是无法开辟空间,也就是说一个数组只能存十个数据,你偏偏要放十一个,那自然是放不下的。所以就有了链表发挥作用的地方了。

    了解链表首先要了解结点,结点其实挺好理解的,它是由数据域和指针域组成的,数据域顾名思义就是像数组一样,存数据的地方。而指针域呢?大家可以想想,结点是一个孤立的点,彼此之间都没有联系,指针域就是建立起联系的桥梁。

               

     指针域就是存放下一个结点的地址,这样一来就清晰很多了。那么,反转链表是什么意思,需要达到一个什么样的效果呢

          

    以上面那个图片为例子,哈哈哈嗝,就是这样。

    关于这个题目的思路,我觉得没那么复杂,就是需要创建一个临时变量,用来储存地址,因为当你反转结点的指向方向以后,你会发现你丢失了原来的地址,也就是说你找不到它了,所以需要临时进行储存,如果大家有别的想法,可以一起来分享呀,大家一起学习!

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
typedef struct ListNode
{
	int val;
	struct ListNode * next;
}Node;//创建一个结构体,存放单链表中结点的数据域和指针域

typedef struct ListNode * Linklist;


struct ListNode* reverseList(struct ListNode* head)//把头结点放进去,反转代码
{
	Linklist p = head->next;//指针反转时无法指向下一个函数,因此需要创建一个临时变量存放无法指向的地址
	Linklist pn = p->next;
	head->next = NULL;
	while (pn != NULL)
	{
		p->next = head;
		head = p;
		p = pn;
		pn = pn->next;
	}
	p->next = head;
	return p;
}
struct ListNode* Listinsert(Linklist HeadNode, int e)//插入元素,创建一个单链表
{
	Linklist p = (Linklist)malloc(sizeof(Node));
	p->val = e;
	HeadNode->next = p;
	p->next = NULL;
	return p;
}
void Print(Linklist w, int x)//打印反转后的单链表
{
	int i = 0;
	for (i = 0; i<x; i++)
	{
		printf("%d ", w->val);
			w = w->next;
	}
}
int main()
{
	int Nodequant = 0;
	int i = 0;
	Linklist head = (Linklist)malloc(sizeof(Node));
	head->next = NULL;
	int data = 0;
	Linklist p = head;
	printf("请输入你想输入节点数目>>");
	scanf("%d", &Nodequant);
	printf("\n");
	for (i = 0; i<Nodequant; i++)
	{
		printf("第%d个节点>>", i + 1);
		scanf("%d", &data);
		p = Listinsert(p, data);
	}
	Linklist reverhead = reverseList(head);
	Print(reverhead, Nodequant);
	return 0;
}

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值