反转链表-头插反转法
(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;
}
反转链表-头插反转法相关推荐
- 92. 反转链表 II【穿针引线、头插法(tmp.next、pre.next 太妙了,绝绝子~)】
92. 反转链表 II 穿针引线法: 如果[需要从头开始反转],则需要加[虚拟头结点]. class Solution { // java 穿针引线public ListNode reverseBet ...
- 常考数据结构与算法:每k个节点反转链表
题目: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这 ...
- LeetCode 中等难度 92. 反转链表 II解题思路
92. 反转链表 II 题目:中等难度 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4-& ...
- python 反转链表
反转链表 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点.示例:输入: 1->2->3->4->5->NULL 输出: 5->4->3 ...
- LeetCode 92反转链表Ⅱ93复制ip地址94二叉树的中序遍历
微信搜一搜:bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打卡群,欢迎 ...
- 《剑指offer》反转链表
题目:输入一个链表,反转链表后,输出链表的所有元素. 解析:首先把所有的节点都存到list,然后用集合框架工具Collections的翻转方法把该链表翻转,然后根据集合节点创建单链表返回 /* pub ...
- 每日一题——剑指 Offer24反转链表
如果您是第一次看我写的博客,可以给我点个赞并关注我吗,我会持续分享更多有意思的干货. 文章目录 1 题目 2 思路 3 代码 4 小结 1 题目 剑指 Offer 24. 反转链表 定义一个函数,输入 ...
- 反转链表--清晰易懂的两种方法
反转一个单链表.如下示例:: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL public ...
- 剑指 Offer II 024. 反转链表
注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点. 示 ...
最新文章
- 第三代测序技术的主要特点及其在病毒基因组研究中的应用
- Linux下安装Foxit Reader
- Zabbix server is not running: the information displayed may not be current.
- 【.Net 学习系列】-- EF Core实践(Code First)
- win10 VScode配置GCC(MinGW)
- 联想tab.android 8,安卓平板顶级对决 联想TAB S8-50 PK 小米平板
- 【论文】基于特定实体的文本情感分类总结(PART III)
- WebService学习之三:spring+cxf整合
- 通向从容之道——Getting things done读书笔记
- Halcon 学习笔记 (一)
- 精英模具设计师的“葵花宝典”
- java生成条形码_Java使用jbarcode生成条形码
- 小猿日记 - 程序猿的日常日记(2)
- myeclipse如何导入项目
- Lua5.3 与C交互学习(一)
- 台式电脑怎么改计算机名,台式电脑局域网设置方法
- acm竞赛java很少,Java多线程在ACM竞赛中的应用
- pwnable.kr wp passcode
- IDEA Android开发 连接华为手机调试
- 机器学习完整项目实战附代码(一):探索型数据分析+特征工程+建模+报告
热门文章
- 基于向量的flash开发
- PHP实现word(office文件)转PDF的功能并添加水印
- ubuntu18.04安装xrdp、vnc4server、xubuntu-desktop重启后鼠标键盘丢失的问题
- MIT公开课18.06 Gilbert Strang 线性代数 笔记3 - 正定矩阵及其应用
- 02 java语言基础
- Centos(rocky,red Hat)搭建npt服务,采用阿里ntp时间,保证时间一致性时间
- 阿里热修复集成,sophix加载本地补丁包
- regularization 规范化(L1,L2等等):加惩罚函数降低过拟合
- ros发布节点信息python_ROS Twist和Odometry消息类型使用(Python)
- hacksudo FOG