当前位置:网站首页>反转链表-头插反转法
反转链表-头插反转法
2022-07-30 22:45:00 【代码骑士】
(1)思想:是指在原有链表的基础上,依次将位于链表头部的节点摘下,然后采用从头部插入的方式生成一个新链表,则此链表即为原链表的反转版。
(2)实现(如下图):
一开始创建一个新的头结点,然后在创建一个temp指针。
link * new_head = (link*)malloc(sizeof(link));
new_head->elem = 0;
new_head->next = NULL;
link * temp = NULL;
下一步将摘除掉原链表中的结点:
temp = head->next;
//将 temp 从 head 中摘除
head->next = head->next->next;
进行新链表的头部插入:
//将 temp 插入到 new_head 的头部
temp->next = new_head->next;
new_head->next = temp;
以此类推:
摘除2:
temp = head->next;
head->next = head->next->next;
插入2:
temp->next = new_head->next;
new_head->next = temp;
插入完成:
摘除3:
插入3:

摘除4:
(标志循环结束)
插入4:

插入END。
片段代码:
//头插法反转链表
link * head_reverse(link * head) {
//为新节点添加头节点
link * new_head = (link*)malloc(sizeof(link));
new_head->elem = 0;
new_head->next = NULL;
link * temp = NULL;
if (head == NULL || head->next == NULL || head->next->next == NULL ) {
return head;
}
while (head->next != NULL)
{
temp = head->next;
//将 temp 从 head 中摘除
head->next = head->next->next;
//将 temp 插入到 new_head 的头部
temp->next = new_head->next;
new_head->next = temp;
}
return new_head;
}完整代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct Link{
int elem;
struct Link* next;
}link;
link * initLink() {
int i = 0;
link * temp = NULL;
link * p = (link*)malloc(sizeof(link));//创建头节点
//首元节点先初始化
p->elem = 0;
p->next = NULL;
temp = p;//头指针指向头节点
for (i = 1; i < 5; i++) {
link *a = (link*)malloc(sizeof(link));
a->elem = i;
a->next = NULL;
temp->next = a;
temp = temp->next;
}
return p;
}
void display(link *p) {
link* temp = p->next;//将temp指针重新指向首元结点
//只要temp指针指向的结点的next不是Null,就执行输出语句。
while (temp) {
printf("%d ", temp->elem);
temp = temp->next;
}
printf("\n");
}
//头插法反转链表
link * head_reverse(link * head) {
//为新节点添加头节点
link * new_head = (link*)malloc(sizeof(link));
new_head->elem = 0;
new_head->next = NULL;
link * temp = NULL;
if (head == NULL || head->next == NULL || head->next->next == NULL ) {
return head;
}
while (head->next != NULL)
{
temp = head->next;
//将 temp 从 head 中摘除
head->next = head->next->next;
//将 temp 插入到 new_head 的头部
temp->next = new_head->next;
new_head->next = temp;
}
return new_head;
}
int main()
{
link*p=initLink();
printf("原始链表:");
display(p);
printf("反转链表:");
p=head_reverse(p);
display(p);
return 0;
}
输出结果:

若无头结点:
代码片段:
//头插法反转链表
link * head_reverse(link * head) {
link * new_head = NULL;
link * temp = NULL;
if (head == NULL || head->next == NULL) {
return head;
}
while (head != NULL)
{
temp = head;
//将 temp 从 head 中摘除
head = head->next;
//将 temp 插入到 new_head 的头部
temp->next = new_head;
new_head = temp;
}
return new_head;
}完整代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct Link{
int elem;
struct Link* next;
}link;
link * initLink() {
int i;
link * p = NULL;//创建头指针
link * temp = (link*)malloc(sizeof(link));//创建首元节点
//首元节点先初始化
temp->elem = 1;
temp->next = NULL;
p = temp;//头指针指向首元节点
for (i = 2; i < 5; i++) {
link *a = (link*)malloc(sizeof(link));
a->elem = i;
a->next = NULL;
temp->next = a;
temp = temp->next;
}
return p;
}
void display(link *p) {
link* temp = p;//将temp指针重新指向头结点
//只要temp指针指向的结点的next不是Null,就执行输出语句。
while (temp) {
printf("%d ", temp->elem);
temp = temp->next;
}
printf("\n");
}
//头插法反转链表
link * head_reverse(link * head) {
link * new_head = NULL;
link * temp = NULL;
if (head == NULL || head->next == NULL) {
return head;
}
while (head != NULL)
{
temp = head;
//将 temp 从 head 中摘除
head = head->next;
//将 temp 插入到 new_head 的头部
temp->next = new_head;
new_head = temp;
}
return new_head;
}
int main()
{
link*p=initLink();
printf("原始链表:");
display(p);
printf("反转链表:");
p=head_reverse(p);
display(p);
return 0;
}
边栏推荐
- MySql 5.7.38 download and installation tutorial, and realize the operation of MySql in Navicat
- mysql锁机制
- 抽象类和接口(学习笔记)
- cmd (command line) to operate or connect to the mysql database, and to create databases and tables
- 【Untitled】
- Gxlcms audio novel system/novel listening system source code
- Golang go-redis cluster模式下不断创建新连接,效率下降问题解决
- proxy反向代理
- 【MySQL】DQL相关操作
- Go语学习笔记 - gorm使用 - 表增删改查 Web框架Gin(八)
猜你喜欢

MySQL cursors

MySql 5.7.38 download and installation tutorial, and realize the operation of MySql in Navicat

NEOVIM下载安装与配置

Difference between cookie and session

PhpMetrics 使用

ThinkPHP high imitation blue play cloud network disk system source code / docking easy payment system program

ThinkPHP高仿蓝奏云网盘系统源码/对接易支付系统程序

2sk2225代换3A/1500V中文资料【PDF数据手册】

QT开发简介、命名规范、signal&slot信号槽

MySQL索引常见面试题(2022版)
随机推荐
抽象类和接口(学习笔记)
Mysql进阶优化篇01——四万字详解数据库性能分析工具(深入、全面、详细,收藏备用)
cnpm的安装与使用
成功解决ModuleNotFoundError: No module named ‘Image‘
MySql统计函数COUNT详解
3 minutes to take you to understand WeChat applet development
使用LVS和Keepalived搭建高可用负载均衡服务器集群
详解操作符
MySQL联合查询(多表查询)
@RequestBody、 @RequestParam 、 @PathVariable 和 @Vaild 注解
Navicat new database
mysql获取当前时间
Go的Gin框架学习
【高等数学】矩阵与向量组的秩和等价
Collapse legacy apps
TransGAN代码复现—九天毕昇平台
2022.7.28
vulnhub靶机AI-Web-1.0渗透笔记
The most complete Redis basic + advanced project combat summary notes in history
Golang go-redis cluster模式下不断创建新连接,效率下降问题解决