IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 单链表的合并与反转 -> 正文阅读

[数据结构与算法]单链表的合并与反转

作者:recommend-item-box type_blog clearfix

目录

1.单链表的合并算法

2.单链表的反转


单链表的合并算法

1.单链表合并的前提:必须两个链表中的数据是排好序的!!!

2.单链表的合并算法图解和解析

???????

?1>.你需要一个新的链表;2>.两个链表中同位序的元素进行比较,然后依据合并链表所要求的大小关系放入合并表中。(如图,两个待合并链表中元素的位序是从小到大排列,所以待合并链表的位序也是如此,先将两表的第一位序元素比较,因为2>1,所以将1放在合并表第一位,2放在之后。)?????

?3>.对于剩余元素的处理:如图,现在第二个链表的元素还剩下8和9,所以直接照搬下来即可。但是此时的照搬是有条件的,就是队列一的指针是指向NULL(空)的。

3.单链表合并算法的代码:

//用并归的方式合并单链表
int MergeList(LinkList La, LinkList Lb,LinkList Lc){
	if(La == NULL || Lb == NULL || Lc == NULL){
		printf("这三个链表中存在空链表,请检查。");
		return 0; 
	}
	//检查
	La = La->next;
	Lb = Lb->next;			//移动指针,准备开始比较 
	 
	LNode *pp;
	
	while(La != NULL && Lb != NULL){
		//取La和Lb的较小者
		if(La->data <= Lb->data){
			pp = La;
			La = La->next;	
		}
		else{
			pp = Lb;
			Lb = Lb->next;
		}
		//向C链表中添加结点
		Lc->next = (LNode*)malloc(sizeof(LNode));
		memcpy(&Lc->data, &pp->data, sizeof(ElemType));
		Lc = Lc->next;
		Lc->next = NULL;
	}
		//当一个链表清空之后补下剩余部分 
  		// 把链表La其它的元素追加到Lc中。
  		while (La != NULL)
  		{
    		Lc->next=(LNode *)malloc(sizeof(LNode));  // 分配一个新结点。
    		Lc=Lc->next;
    		memcpy(&Lc->data,&La->data,sizeof(ElemType));
    		Lc->next=NULL;
    		La=La->next;
  		}
    
  // 把链表Lb其它的元素追加到Lc中。
  		while (Lb != NULL)
  		{
   			Lc->next=(LNode *)malloc(sizeof(LNode));  // 分配一个新结点。
    		Lc=Lc->next;
   			memcpy(&Lc->data,&Lb->data,sizeof(ElemType));
   			Lc->next=NULL;
    		Lb=Lb->next;
  		}

  return 1;
} 


单链表的反转

1.图解链表的反转:

?初始的链表

首先第一步操作,就是断掉除头结点之外的链表(假想)。

?断掉之后,下面的链表就相当于一个无头结点的链表,这时候需要再定义一个新指针来标记新的不带头结点链表的地址。

然后开始第二步,就是将只剩下头结点的链表当成一个新列表,将剩下的无头链表当成元素的集合,然后采取将剩下的元素循环入队(可以参考链式队列的入队方法。)

https://blog.csdn.net/m0_54376461/article/details/119655676】(链式队列的入队方法)

?第一个元素入队,就是依靠定义的新指针进行下一个结点的寻址。先入队的结点位置靠后。

?

?第二个元素入队,剩下的元素入队可以参考这个形式。

2.反转链表的代码

void ReverseList(LNode *p){
	LNode *s;			//当前结点 
	LNode *snext;		//当前结点的下一个结点
	
	s=p->next;		//从p结点开始反转
	
	p->next=NULL;
	
	while (s != NULL){
		snext = s->next;		//开头标记下一个结点的地址
		//下面开始将结点插入
		s->next = p->next;		//将定义的结点指针指向剩下的无头链表 
		p->next = s;			//元素入队 
		
		s=snext;                //s结点后移,准备下一次循环 
	}
}  

思路解释

注意:函数的参数是原链表的地址,新定义的两个结点是用来做循环插入的,下面重点讲述一下while循环中的代码段

s=p->next;		//从p结点开始反转

?这个操作是将新结点调至为头结点的后一位,准备插入

p->next = NULL;

?这个操作即为断掉列表(一定要注意,先定义储存地址值再断掉)

while (s != NULL)

这个循环条件是当剩下的无头队列还存在元素时,继续维持插入操作。

?

s->next = p->next;		//将定义的结点指针指向剩下的无头链表 
p->next = s;			//元素入队 
		
s=snext;                //s结点后移,准备下一次循环

?首先第一行的操作就是将s之后的指针置为空,(因为s指针和ss指针都已经有保存,防止冲突)第二行就是元素入队,第三行就是将s指向下一个元素。

注意!!! 看这个while循环时一定要注意,不要持续的想象第一个结点来助记,多想象一下指针向前滚动的样子更方便理解。

????????

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-18 12:56:50  更:2021-08-18 12:59:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:16:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码