当前位置: 首页 > news >正文

单链表反转C语言代码

单链表反转的整体代码如下:

#include<stdio.h>
#include<stdlib.h>

typedef struct LinkedNode{
    int data;
    struct LinkedNode *next;
}node; 
int main(){
	node* head = NULL;
	node* sentinelNode = (node *)malloc(sizeof(node));
	head = sentinelNode;
	printf("sentinelNode data:%d\n",sentinelNode->data);
	int i = 1;
	//recordNode用来记录一些循环中的结点
	node* recordNode = (node *)malloc(sizeof(node));
	sentinelNode->next = recordNode;
	//使用while循环把1~3这几个值放到链表里边 
	while(i<=3){
		recordNode->data = i;
		node* creatingNode = (node *)malloc(sizeof(node));
		creatingNode->next = NULL;
		recordNode->next = creatingNode;
		recordNode = creatingNode;
		i++;
	}
	node* travelNode = head;
	//从1到3正序输出
	while(travelNode->next!=NULL){
		printf("%d\n",travelNode->data);
		travelNode = travelNode->next;
	}
	//下边开始进行链表反转代码
    recordNode = sentinelNode->next;
    node* presentNode = recordNode;
	node* followingNode = recordNode->next;
    while(followingNode!=NULL && followingNode->next != NULL){
		presentNode->next = followingNode->next;
		followingNode->next = recordNode;
		recordNode = followingNode;
		followingNode = presentNode->next;
	} 
    sentinelNode->next = recordNode;//将哨兵结点后续指针指向新的链表第一个数据结点
    travelNode = head;
	//逆序输出,从3到1 
	printf("after reservering:\n");
	while(travelNode!=NULL){
		printf("data:%d\n",travelNode->data);
		travelNode = travelNode->next;
	}
	return 0; 
}

下边代码初始化一个有5个结点的链表,其中有1个哨兵结点,3个数据结点和1个尾结点(不存储数据):

	node* recordNode = (node *)malloc(sizeof(node));
	sentinelNode->next = recordNode;
	//使用while循环把1~3这几个值放到链表里边 
	while(i<=3){
		recordNode->data = i;
		node* creatingNode = (node *)malloc(sizeof(node));
		creatingNode->next = NULL;
		recordNode->next = creatingNode;
		recordNode = creatingNode;
		i++;
	}

上边代码初始化之后,如下图所示:
在这里插入图片描述
下边介绍链表翻转的代码:

//下边开始进行链表反转代码
	recordNode = sentinelNode->next;
	node* presentNode = recordNode;
	node* followingNode = recordNode->next;

执行完这三行代码,如下图所示:
在这里插入图片描述在图中,接下来用sN代表sentinelNode,rN代表recordNode,pN代表presentNode,fN代表followingNode。
接下来分析反转的while循环部分:

    while(followingNode!=NULL && followingNode->next != NULL){
		presentNode->next = followingNode->next;
		followingNode->next = recordNode;
		recordNode = followingNode;
		followingNode = presentNode->next;
	} 

第1次执行presentNode->next = followingNode->next;,效果如下图:
在这里插入图片描述
第1次执行followingNode->next = recordNode;,如下图:
在这里插入图片描述
第1次执行recordNode = followingNode;,如下图:
在这里插入图片描述

第1次执行followingNode = presentNode->next;,如下图:
在这里插入图片描述

第2次执行presentNode->next = followingNode->next;,如下图:
在这里插入图片描述

第2次执行followingNode->next = recordNode;,如下图:
在这里插入图片描述

第2次执行recordNode = followingNode;,如下图:
在这里插入图片描述

第2次执行followingNode = presentNode->next;,如下图:
在这里插入图片描述

接下来就会跳出循环体执行代码sentinelNode->next = recordNode;
在这里插入图片描述

最后的运行结果如下图:
在这里插入图片描述

——极客时间《数据结构与算法之美》学习笔记 Day 21

相关文章:

  • Visual Paradigm 17.X Crack
  • 【微服务】RabbitMQ高级篇
  • Dubbo-----------------项目整合和分析
  • ROS2 入门应用 工作空间
  • AOSP 8.0 系统启动之四ART虚拟机启动(一)
  • 1079 Total Sales of Supply Chain
  • 基于DemonSet方式收集容器日志输出实践
  • 牛客网:JZ65 不用加减乘除做加法(详解)
  • 设计模式:观察者模式
  • C/C++基础 memset()函数的用法
  • LeetCode 2176. 统计数组中相等且可以被整除的数对
  • 直线生成算法(DDA算法)
  • 10技术太卷我学APEX-导航卡Card
  • 红黑树插入结点
  • python入门 之 字典(六)
  • 通过python编写自定义尺寸和位置批量进行图像剪裁
  • 开发人员对需求的正确打开方式
  • SQLSERVER 快照隔离级别 到底怎么理解?
  • 《SQL基础》09. 事务
  • 设计模式-第1章(简单工厂模式)
  • 电加热油锅炉工作原理_电加热导油
  • 大型电蒸汽锅炉_工业电阻炉
  • 燃气蒸汽锅炉的分类_大连生物质蒸汽锅炉
  • 天津市维修锅炉_锅炉汽化处理方法
  • 蒸汽汽锅炉厂家_延安锅炉厂家
  • 山西热水锅炉厂家_酒店热水 锅炉
  • 蒸汽锅炉生产厂家_燃油蒸汽发生器
  • 燃煤锅炉烧热水_张家口 淘汰取缔燃煤锅炉
  • 生物质锅炉_炉
  • 锅炉天然气_天燃气热风炉