编写算法实现带头结点单链表seqlist的就地逆置,即利用原带头结点单链表seqlist的结点空间,把数据元素顺序排反


题目分析:

在前面2-18讲了顺序表的就地逆置,但单链表的就地逆置与顺序表有所不同,因为顺序表可以根据下标值直接快速的找到对应的数据,而单链表只能从头结点一个一个的遍历才能找到相应数据元素,所以逆置单链表不采用第一个结点和最后一个结点交换的方式。那怎么做呢?

既然都讲到这里了,咱就先来讨论讨论单链表的两种建立方式————头插法和尾插法

利用尾插法建立的单链表数据是顺序的,用头插法建立的单链表数据是逆序的

例如:用数列 2,4,6,8,10,12六个数字来建立单链表

如果利用尾插法,得到的链表是这样的:2,4,6,8,10,12
用头插法,得到的链表是这样的:12,10,8,6,4,2
Are you understand?
接下来咱来分析分析为什么是这样的



下面给出头插法和尾插法的代码:

/*尾插法建立单链表——得到的链表是顺序的
利用数组的前n个数建立一条单链表*/
void listBuildRear(Node *head, dataType arr[], int n)
{Node *p = head;                       //新增一个指针,用来代替head指针for (int i = 0; i < n; i++)              //循环n次,每次循环都在链表尾部追加一个结点{Node *q = (Node*)malloc(sizeof(Node));//新建立结点,并为之分配内存空间q->data = arr[i];                 //数据域赋值,将数组的第i+1个数字赋给新结点qq->next = NULL;                   //单链表最后一个结点的指针域都为空p->next = q;                      //将原始单链表最后一个结点指针域指向新结点q,从此q成为最后一个结点,原始最后一个结点变成倒数第二个结点p = q;                            //p又指向当前链表最后一个结点,为下一次尾部插入做准备}
}
/*头插法建立单链表——得到的链表是逆序的
利用数组的前n个数建立一条单链表*/
void listBuildHead(Node *head,dataType arr[],int n)
{for(int i = 0;i < n;i++){Node *q = (Node*)malloc(sizeof(Node));q->data = arr[i];q->next = head->next;              //紧跟头结点后面插入数据结点head->next = q;}}

尾插法和头插法的补充知识就到这里了,我们再来看这道题

尾插法是顺序的,头插法是逆序的,这题要我们就地逆置,也就是完成逆序,毫无疑问我们会想到头插法,所以我们的解题思路就是,在遍历链表的同时,利用头插法一个一个再建立新的链表

请看下图》》》》》》》》》》》》》


代码实现:

#include<stdio.h>
#include<stdlib.h>
typedef int dataType;    //数据类型为int
//结点结构体
typedef struct node
{dataType data;      //数据域struct node *next;  //指针域
}Node;
//初始化结点
void listInitiate(Node **head)            //双星指针,地址的地址,在初始化时,我们要使地址的值改变,所以使用双星作为参数传入
{*head = (Node*)malloc(sizeof(Node));  //为头结点分配位置空间(一个结点的大小)(*head)->next = NULL;                 //头结点指针域初始默认为空
}
/*尾插法建立单链表——得到的链表是顺序的
利用数组的前n个数建立一条单链表*/
void listBuildRear(Node *head, dataType arr[], int n)
{Node *p = head;                       //新增一个指针,用来代替head指针for (int i = 0; i < n; i++)              //循环n次,每次循环都在链表尾部追加一个结点{Node *q = (Node*)malloc(sizeof(Node));//新建立结点,并为之分配内存空间q->data = arr[i];                 //数据域赋值,将数组的第i+1个数字赋给新结点qq->next = NULL;                   //单链表最后一个结点的指针域都为空p->next = q;                      //将原始单链表最后一个结点指针域指向新结点q,从此q成为最后一个结点,原始最后一个结点变成倒数第二个结点p = q;                            //p又指向当前链表最后一个结点,为下一次尾部插入做准备}
}
//遍历输出函数
void listPrint(Node *head)
{printf("单链表:");Node *p = head;                       //新增一个指针,用来代替head指针while (p->next != NULL){printf("%d   ", p->next->data);p = p->next;                      //这一句不要忘了,不然会死循环的,我总是忘掉这一句}printf("\n");
}
//就地逆置函数
void listReserve(Node* head)
{if (head == NULL || head->next == NULL || head->next->next == NULL) //如果单链表为空、只有一个结点,本身就是逆序return;Node* p = head->next->next;           //将链表的第一个结点给一个指针p,以免丢失数据head->next->next = NULL;              //将第一个结点和第二个结点分开while (p != NULL)                     //遍历链表{Node* q = p->next;p->next = head->next;head->next = p;                   //在头结点的前面插入新的结点p = q;                            //为下一次插入做准备}
}
int main()
{Node link1;Node *p;dataType arr[] = {2,4,6,8,10,12,14};p = &link1;listInitiate(&p);listBuildRear(p,arr,7);      //利用数组arr的前七个数据建立一条链表printf("原");listPrint(p);                //打印原链表printf("就地逆置之后的");listReserve(p);              //打印逆置后的链表listPrint(p);return 0;
}

运行结果:


代码编译器:Dev-C++
ok,完美解决

【单链表】单链表的就地逆置相关推荐

  1. 反转链表详细讲解(就地逆置法)

    1.题目:牛客网NC78(反转链表) 描述 输入一个链表,反转链表后,输出新链表的表头. 示例1 输入:{1,2,3} 返回值:{3,2,1} 2.就地逆转法反转链表 只需要两个指针beg和end,解 ...

  2. 无头结点单链表的逆置_第1章第2节练习题11 就地逆置单链表

    ## 问题描述 > 试编写在带头结点的单链表就地逆置,所谓"就地"是指辅助空间为O(1) ## 算法思想1 > 将头结点摘下,然后从第一个结点开始,依次插入到头节点的后 ...

  3. 单链表的应用 就地逆置

    [问题描述]试实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1,a2,a3....an)逆置为(an...a3,a2,a1).    [分析]就地逆置就是不需要额外申请结点空间,只需要利用原 ...

  4. python实现带头结点的单链表的就地逆置_6-1 带头结点的单链表就地逆置 (10 分)...

    本题要求编写函数实现带头结点的单链线性表的就地逆置操作函数.L是一个带头结点的单链表,函数ListReverse_L(LinkList &L)要求在不新开辟节点的前提下将单链表中的元素进行逆置 ...

  5. 单链表就地逆置(Java版)

    题目:有一个线性表(a1,a2,a3,...,an),采用带头节点的单链表L存储,设计一个算法将其就地逆置,线性表变为(an,...a3,a2,a1).所谓"就地"指辅助存储空间为 ...

  6. 头插法逆置单向链表c语言,单链表的逆置(头插法和就地逆置)

    今天课间的时候偶然看到了一个面试题:单链表的逆置,看了题解感觉乖乖的,貌似和以前看的版本不搭,于是重新进行了一番探究 单链表的逆置分为两种方法:头插法和就地逆置法,这两种方法虽然都能够达到逆置的效果, ...

  7. java实现单链表就地逆置,单链表的就地逆置讲解

    { List *q; List *p = L->next; L -> next = NULL; //单链表就地逆置 while (p != NULL) { q = p -> next ...

  8. 链表就地逆置Java_单链表就地逆置(Java版)

    题目:有一个线性表(a1,a2,a3,...,an),采用带头节点的单链表L存储,设计一个算法将其就地逆置,线性表变为(an,...a3,a2,a1).所谓"就地"指辅助存储空间为 ...

  9. java实现单链表就地逆置,20. 微软面试题:单链表就地逆放

    题目是:链表操作,单链表就地逆置 分析: 这题只需要设置三个指针就搞定了,ListNode* p 表示当前指针, ListNode* fp: 上一个节点指针, ListNode * ep :下一个节点 ...

最新文章

  1. Android源码下载资料
  2. 风格化图像_【技术综述】人脸风格化核心技术与数据集总结
  3. SpringBoot(2.4.0)自动配置原理(源码)
  4. 《苹果往事:开发麦金托什的非凡岁月》撷英
  5. 在C语言中巧用正则表达式
  6. 设单片机的晶振频率为6mhz c语言,单片机习题科学出版社.doc
  7. 钉钉下载与安装过程 适用于windows系统 20200718
  8. TokenInsight:BTC多头比例延续上升,人气保持高位
  9. [转](转载+整理)超详细的cmake教程
  10. 在MyEclipse中配置Tomcat服务器
  11. 每天CookBook之JavaScript-032
  12. repo/git下载android源码断后重新下载
  13. 巧妙的实现 CSS 斜线
  14. cat3 utp是不是网线_五类网线(CAT 5E/CAT 3 UTP)
  15. Redis 操作命令大全
  16. 二进制转化为十六进制
  17. Math工具的使用 abs,ceil floor round
  18. 6-1 求实数和的函数
  19. 如何利用ps制作一张全景图?
  20. ug安装lmtools显示未连接服务器,服务器(LMTOOLS)设置教程

热门文章

  1. HTML+js实现贪吃蛇小游戏(内含完整代码)
  2. 浙大提出神经3D重建新工作!收录图形学顶会SIGGRAPH 2022
  3. 基于PHP开发的云平台网络课堂教学学习互动平台设计
  4. python人民邮电出版社_人民邮电出版社 - 主页
  5. 战略项目——科龙空调中高层干部培训记
  6. plc实验报告流程图_plc实验报告
  7. 微信公众号开发笔记(二):微信分享接口实现和问题
  8. 监控系统与服务器的连接,监控服务器的连接方法
  9. fig-tlo_PHP-FIG的替代方案:各种愿景的利弊
  10. 计算机系统基础实验 pa1