(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;
} 

反转链表-头插反转法相关推荐

  1. 92. 反转链表 II【穿针引线、头插法(tmp.next、pre.next 太妙了,绝绝子~)】

    92. 反转链表 II 穿针引线法: 如果[需要从头开始反转],则需要加[虚拟头结点]. class Solution { // java 穿针引线public ListNode reverseBet ...

  2. 常考数据结构与算法:每k个节点反转链表

    题目: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这 ...

  3. LeetCode 中等难度 92. 反转链表 II解题思路

    92. 反转链表 II 题目:中等难度 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4-& ...

  4. python 反转链表

    反转链表 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点.示例:输入: 1->2->3->4->5->NULL 输出: 5->4->3 ...

  5. LeetCode 92反转链表Ⅱ93复制ip地址94二叉树的中序遍历

    微信搜一搜:bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打卡群,欢迎 ...

  6. 《剑指offer》反转链表

    题目:输入一个链表,反转链表后,输出链表的所有元素. 解析:首先把所有的节点都存到list,然后用集合框架工具Collections的翻转方法把该链表翻转,然后根据集合节点创建单链表返回 /* pub ...

  7. 每日一题——剑指 Offer24反转链表

    如果您是第一次看我写的博客,可以给我点个赞并关注我吗,我会持续分享更多有意思的干货. 文章目录 1 题目 2 思路 3 代码 4 小结 1 题目 剑指 Offer 24. 反转链表 定义一个函数,输入 ...

  8. 反转链表--清晰易懂的两种方法

    反转一个单链表.如下示例:: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL public ...

  9. 剑指 Offer II 024. 反转链表

    注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点. 示 ...

最新文章

  1. Java 未死,依然很牛逼!
  2. 组件注册——@ComponentScan自动扫描组件指定扫描规则
  3. python 曲线回归_线性回归——Python代码实现
  4. mysql max datetime_MYSQL在联接语句中选择MAX日期
  5. aptitude_PHP Numbers Aptitude问题与解答
  6. c语言求字符串转换成双精度_C语言实现把字符串中的数字转换成整数
  7. IS-IS基础网络配置实例
  8. 蜡笔小新模拟器汉化版_FC蜡笔小新条码版下载-蜡笔小新条码版FC模拟器下载-电玩咖...
  9. 公司银行考试有C语言程序吗,银行春季校园招聘计算机岗笔试考什么?会考编程吗?...
  10. python判断火车票座位是否靠窗_Python查询火车票(一)
  11. 组合模型预测模型_改进著名的nfl预测模型
  12. 实习第一个月体会和总结
  13. MoCo v1 论文阅读笔记
  14. 华为设备DHCP snooping配置命令
  15. IDA官网发布的每周技巧8----以批处理模式在后台运行IDA
  16. css:利用伪类处理图片加载失败的样式问题
  17. 如何量化考核软件开发人员绩效 1
  18. 大数据和人工智能的相关比赛
  19. Spring Cloud OAuth2 认证服务器
  20. 解决问题Description Resource Path Location Type Archive for required library:

热门文章

  1. python—xlwt模块详解
  2. 原生js 获取页面宽度
  3. 3.1 mxc_v4l2_capture.c分析---probe函数分析
  4. 2022年信息安全工程师考试知识点:电子商务安全
  5. python绘图之matlibplot
  6. 2023年国开《ERP原理与应用》实验1-5学习行为表现
  7. (林大oj1276)
  8. springboot之aop切面获取请求
  9. Studio 3T 破解教程
  10. 我有一个梦想--读《致员工的一封信》有感(转)