(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. 第三代测序技术的主要特点及其在病毒基因组研究中的应用
  2. Linux下安装Foxit Reader
  3. Zabbix server is not running: the information displayed may not be current.
  4. 【.Net 学习系列】-- EF Core实践(Code First)
  5. win10 VScode配置GCC(MinGW)
  6. 联想tab.android 8,安卓平板顶级对决 联想TAB S8-50 PK 小米平板
  7. 【论文】基于特定实体的文本情感分类总结(PART III)
  8. WebService学习之三:spring+cxf整合
  9. 通向从容之道——Getting things done读书笔记
  10. Halcon 学习笔记 (一)
  11. 精英模具设计师的“葵花宝典”
  12. java生成条形码_Java使用jbarcode生成条形码
  13. 小猿日记 - 程序猿的日常日记(2)
  14. myeclipse如何导入项目
  15. Lua5.3 与C交互学习(一)
  16. 台式电脑怎么改计算机名,台式电脑局域网设置方法
  17. acm竞赛java很少,Java多线程在ACM竞赛中的应用
  18. pwnable.kr wp passcode
  19. IDEA Android开发 连接华为手机调试
  20. 机器学习完整项目实战附代码(一):探索型数据分析+特征工程+建模+报告

热门文章

  1. 基于向量的flash开发
  2. PHP实现word(office文件)转PDF的功能并添加水印
  3. ubuntu18.04安装xrdp、vnc4server、xubuntu-desktop重启后鼠标键盘丢失的问题
  4. MIT公开课18.06 Gilbert Strang 线性代数 笔记3 - 正定矩阵及其应用
  5. 02 java语言基础
  6. Centos(rocky,red Hat)搭建npt服务,采用阿里ntp时间,保证时间一致性时间
  7. 阿里热修复集成,sophix加载本地补丁包
  8. regularization 规范化(L1,L2等等):加惩罚函数降低过拟合
  9. ros发布节点信息python_ROS Twist和Odometry消息类型使用(Python)
  10. hacksudo FOG