今天课间的时候偶然看到了一个面试题:单链表的逆置,看了题解感觉乖乖的,貌似和以前看的版本不搭,于是重新进行了一番探究

单链表的逆置分为两种方法:头插法和就地逆置法,这两种方法虽然都能够达到逆置的效果,但还是有着不小的差别

头插法

算法思路:依次取原链表中的每一个节点,将其作为第一个节点插入到新链表中,指针用来指向当前节点,p为空时结束。

核心代码

void reverse(node*head)

{

node*p;

p=head->next;

head->next=NULL;while(p)

{

q=p;

p=p->next;

q->next=head->next;

head->next=q;

}

}

以上面图为例子,说白了就是不断的将1后面的节点插入到head后面,即为头插法

完整代码

#include#includetypedefstructnode

{intdata;struct node*next;

}node;

node*creat()

{

node*head,*p,*q;charch;

head=(node*)malloc(sizeof(node));

q=head;

ch='*';

puts("单链表尾插法,?结束");while(ch!='?')

{inta;

scanf("%d",&a);

p=(node*)malloc(sizeof(node));

p->data=a;

q->next=p;

q=p;

ch=getchar();

}

q->next=NULL;return(head);

}void print(node*a)

{

puts("print");

a=a->next;while(a!=NULL)

{

printf("%d",a->data);

a=a->next;

}

}void reverse(node*head)

{

node*p,*q;

p=head->next;

head->next=NULL;while(p)

{

q=p;

p=p->next;

q->next=head->next;

head->next=q;

}

}

main()

{

node*a;

a=creat();

print(a);

reverse(a);

puts("\nhaved reversed:");

print(a);return 0;

}

View Code

程序截图

就地逆置法

//单链表定义

typedef structListNode{intm_nValue;

ListNode*pNext;

};

//单链表逆置实现

ListNode* ReverseList(ListNode*pHead)

{if (pHead == NULL || pHead->pNext ==NULL)

{

retrun pHead;

}

ListNode* pRev =NULL;

ListNode* pCur =pHead;while(pCur !=NULL)

{

ListNode* pTemp = pCur; //步骤①

pCur = pCur->pNext; //步骤②

pTemp->pNext = pRev; //步骤③

pRev =pTemp;

}returnpRev;

}

链表的翻转是程序员面试中出现频度最高的问题之一,常见的解决方法分为递归和迭代两种。最近在复习的时候,发现网上的资料都只告诉了怎么做,但是根本没有好好介绍两种方法的实现过程与原理。所以我觉得有必要好好的整理一篇博文,来帮忙大家一步步理解其中的实现细节。

我们知道迭代是从前往后依次处理,直到循环到链尾;而递归恰恰相反,首先一直迭代到链尾也就是递归基判断的准则,然后再逐层返回处理到开头。总结来说,链表翻转操作的顺序对于迭代来说是从链头往链尾,而对于递归是从链尾往链头。

具体实现可以参考这个博主:https://blog.csdn.net/FX677588/article/details/72357389

整体实现代码:

#include

using namespacestd;structnode{intval;struct node*next;

node(intx) :val(x){}

};/***非递归方式***/node* reverseList(node*H)

{if (H == NULL || H->next == NULL) //链表为空或者仅1个数直接返回

returnH;

node* p = H, *newH =NULL;while (p != NULL) //一直迭代到链尾

{

node* tmp = p->next; //暂存p下一个地址,防止变化指针指向后找不到后续的数

p->next = newH; //p->next指向前一个空间

newH = p; //新链表的头移动到p,扩长一步链表

p = tmp; //p指向原始链表p指向的下一个空间

}returnnewH;

}/***递归方式***/node* In_reverseList(node*H)

{if (H == NULL || H->next == NULL) //链表为空直接返回,而H->next为空是递归基

returnH;

node* newHead = In_reverseList(H->next); //一直循环到链尾

H->next->next = H; //翻转链表的指向

H->next = NULL; //记得赋值NULL,防止链表错乱

return newHead; //新链表头永远指向的是原链表的链尾

}intmain()

{

node* first = new node(1);

node* second = new node(2);

node* third = new node(3);

node* forth = new node(4);

node* fifth = new node(5);

first->next =second;

second->next =third;

third->next =forth;

forth->next =fifth;

fifth->next =NULL;//非递归实现

node* H1 =first;

H1= reverseList(H1); //翻转//递归实现

node* H2 = H1; //请在此设置断点查看H1变化,否则H2再翻转,H1已经发生变化

H2 = In_reverseList(H2); //再翻转

return 0;

}

头插法逆置单向链表c语言,单链表的逆置(头插法和就地逆置)相关推荐

  1. 逆转线性单链表 c语言,单链表的逆转,不会做啊

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 以前做的还找得到,呵呵,绐你贴出来了,C语言版的 #include struct datatype{ char a[30]; }; struct node ...

  2. 字符串的冒泡排序c语言,c语言单链表冒泡排序_c语言字符串排序冒泡法_c语言链表排序...

    1. #include 2. 3. struct Node; 4. 5. typedef struct Node *PtrToNode; 6. typedef PtrToNode List; 7. t ...

  3. C语言单链表讲解(上):有表头链表的使用

    目录 前言 单链表的分类 有表头单链表 一.create()创建链表,后面产生的结构体将放在表头后面 二.newNote()创建节点,读取用户输入的记录,生成结构体数据 三.insert()从表头插入 ...

  4. c语言单链表设计报告,单链表实验报告

    <数据结构>实验报告二 分校: 学号: 日期: 班级: 姓名: 程序名: L2311.CPP 一.上机实验的问题和要求: 单链表的查找.插入与删除.设计算法,实现线性结构上的单链表的产生以 ...

  5. C语言单链表基本操作总结

    C语言单链表基本操作     本文是参考他人实现的C语言单链表,对多篇博文整理的结果,仅作为学习笔记.文末有参考出处. 1.单链表定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单 ...

  6. C语言单链表代码实现

    C语言单链表代码实现 一.头文件.常量以及自定义数据结构 #include<stdio.h> #include<malloc.h> #include<stdlib.h&g ...

  7. c语言单链表输出26英文字母,C语言单链表的实现

    单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. 链表结构: SList.h #pragma once typedef int DataType; typedef st ...

  8. C语言单链表实现初始化、创建、增、删、查等基本操作(详细)

    C语言单链表实现初始化.创建.增.删.查等基本操作 #include <stdio.h> #include <stdlib.h> #include <malloc.h&g ...

  9. 数据结构中单链表的存储c语言,单链表一 - 数据结构与算法教程 - C语言网

    1. 单链表概念&设计 单链表是一种链式存取的数据结构,,链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指 ...

最新文章

  1. 在CLion中运行Ninja项目
  2. sqlplus连mysql库_sqlplus连接服务器的Oracle的经历
  3. Vue+Openlayer使用overlay实现弹窗弹出显示与关闭
  4. Ecshop中的ajax+json
  5. 日志文件在VS中输出为乱码问题
  6. Halcon例程详解(激光三角系统标定)—— calibrate_sheet_of_light_calplate.hdev
  7. Python3安装(Linux)
  8. shell_之_find(查找)
  9. mysql抽屉图标_React Native自定义组件实现抽屉菜单控件效果
  10. 红帽RHEL8和RHEL7有什么区别?
  11. redis 和 memcached的区别
  12. MySql类似Oracle的dual虚拟表
  13. WIN8系统中 任务管理器 性能栏 显示CPU利用率(已暂停)怎么回事?
  14. 【Keil5】关于keli5使用ST-link下载的配置方法
  15. STM32F1xx_StdPeriph_Driver——I2C
  16. 对话90后,移动互联网新生代力量行为调查-20140219早读课
  17. FPS的瞄准准心的一种写法
  18. 钢铁行业经销商商城系统:完善钢材管控方案,轻松实现控价和防伪
  19. python.opencv.imread读图顺序:从上到下,从左到右
  20. hbuilderx gitee操作教程

热门文章

  1. Windows系统上的软件(如:爱奇艺万能播放器)固定任务栏图标后,打开后出现新任务栏图标
  2. Eclipse使用入门
  3. Oracle数据库表空间整理回收与释放操作
  4. 百度阿里网易大疆等大小厂前端校招面筋
  5. 【JavaScript进阶学习】NodeJs语言的介绍及基本使用
  6. golang直接调用ffmpeg预编译类库(windows)
  7. Cloud Hosted Notebook Showdown(云托管笔记本)
  8. 拼图游戏(8 puzzle)
  9. Windows GDI 窗口与 Direct3D 屏幕截图
  10. winform程序内存不足或假死的问题