单链表Single-LinkList

这篇具有很好参考价值的文章主要介绍了单链表Single-LinkList。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0、节点结构体定义

typedef struct LNode{
	
	int data;
	struct LNode *next;
	
} Lnode, *LinkList;

1、初始化

bool InitList(LinkList &L)	//初始化 
{
	L = new LNode;
	
	if(!L){
		return false;
	}
	L->next = NULL;
	
	return true;
}

2、创建

(1)头插法

void CreateList_H(LinkList &L, int n)	//头插法创建 
{
	LinkList s;
	
	while(n--){	//--n不行!! 
		s = new LNode;
		
		cin>> s->data;
		
		s->next = L->next;		//链表的i++ 
		L->next =s;	
	}
}
//反复利用链表头L和新节点s添加(就是插入...) 

(2)尾插法

void CreateList_R(LinkList &L, int n)	//尾插法创建 
{
	LinkList s, r = L;
	
	while(--n){
		s = new LNode;
		
		cin>> s->data;
		
		r->next = s;			//链表的i++
		s->next = NULL;
		r = s;
	}
}
//利用r存储当前节点信息,便利于新节点s的添加 

3、查找

(1)查找具体元素

bool Finde(LinkList &L, int e)	//查找具体元素 
{
	LinkList p = L->next;
	
	while(p != NULL && p->data != e){
		p = p->next;
	}
	if(!p){
		return false;
	}
	return true;
}

(2)查找第 i 个元素

bool GetElemi(LinkList &L, int i, int &e)	//查找第i个元素 
{
	int j = 1;				//记不住就初始化为 j = 1、p = L 
	LinkList p = L->next;  //因为后面都是这样(保对),而且也没增加什么时间 
	
	while(p && j<i){
		p = p->next;
		++j;
	}
	if(!p || j>i){		//i值不合法:i>n || i<0 
		return false;
	}
	e = p->data;		//用e记录元素i 
	
	return true;
}

4、插入

bool ListInsert(LinkList &L, int i, int e) 	//在第i个元素后插入元素 
{
	 int j = 0;
	 LinkList p = L;	//保证能在第一个元素前插入 
	 
	 while(p && j<i){
	 	p = p->next;
	 	++j;
	 }
	 if(!p || j>i){
	 	return false;
	 }
	 //上面就是查找操作... 
	 LinkList s = new LNode;
	 
	 s->data = e;
	 
	 s->next = p->next;
	 p->next = s;
	 
	 return true;
}

5、删除

bool ListDelete(LinkList &L, int i)	//删除第i个元素 
{
	int j = 0;
	LinkList p = L;		//保证能删除第 1个元素 
	
	while(p && j<i-1){
		p = p->next;
		++j;
	}
	if(!p ||j>i-1){
		return false;
	}
	//上面还是查找操作...(找第元素i-1)
	LinkList q = p->next;	//使用临时变量更安全!(p->next->next = p->next; delete p->next; 
	
	p->next = q->next;	   //当n=2时会出错!因为要删除的p->next已经变成NULL了!) 
	
	delete q;
	
	return true;
}

6、释放内存

bool ListRelese(LinkList &L)
{
	LinkList p;
	
	while(L){
		p = L;			//暂存当前节点 
		L = L->next;	//更新为下一节点 
		delete p;		//删除当前节点 
		
		/*这样也ok: 
		**p = L->next;// 暂存下一个节点
		**delete L;// 删除当前节点
		**L = p;// 更新当前节点为下一个节点
		*/
	}
	
	return true;
}

7、其他操作

(1)查找中间元素

LinkList FindMid(LinkList L)	//查找中间的节点 
{						//不会修改L就不用传引用!
	LinkList p = L, q = L;
	
	while(p){
		q = q->next;
		p = p->next->next;
	}
	return q;
}

(2)查找倒数第 k 个节点

LinkList Findk(LinkList L, int k)	//查找倒数第k个节点 
{
    LinkList p, q;
    p=L->next; 
    q=L->next; 
    while(p->next!=NULL)
    {
        if(--k<=0) //k减到0时,慢指针开始走
            q=q->next; 
        p=p->next; //p为快指针,先走k-1步
    }
    if(k>0)
        return NULL;
    else
    	return q; 
}

(3)合并有序链表

/合并有序链表:将两个有序(非递减)单链表La和Lb合并为一个新的有序(非递减)单链表Lc 
LinkList ListMerge(LinkList LA, LinkList LB)
{
	LinkList p = LA->next ,q = LB->next; 
	LinkList LC = LA, r = LC;
	
	while(p && q){
		if(p->data > q->data){
			r->next = q;
			r = q;
			q = q->next;
		}else{
			r->next = p;
			r = p;
			p = p->next;
		}
	}
	r->next = p? p:q;
	
	delete LB;
	
	return LC;
} 

(4)逆转链表文章来源地址https://www.toymoban.com/news/detail-667115.html

void ListReverse(LinkList &L)	//逆转单链表 
{
	LinkList p = L->next, q;
	L->next = NULL;
	
	while(p){
		q = p->next;
		
		p->next = L->next;
		L->next = p;
		
		p = q;
	} 
}

到了这里,关于单链表Single-LinkList的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】单链表详解

    当我们学完顺序表的时候,我们发现了好多问题如下: 中间/头部的插入删除,时间复杂度为O(N) 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们 再继续插入了

    2024年02月09日
    浏览(35)
  • 数据结构——单链表(上)

    🌇个人主页:_麦麦_ 📚今日名言:“生活总是让我们遍体鳞伤,但到后来,那些受伤的地方一定会变成我们最强壮的地方。”        ——海明威《永别了武器》 目录 ​编辑 一、前言 二、正言  3.1链表的概念及结构 3.2链表的分类 3.3链表的实现【无头单向非循环】 3.

    2024年02月02日
    浏览(41)
  • 数据结构入门——单链表

    目录 前言 链表的定义 链表的创建 头插法创建链表 尾插法创建链表 链表的删除 在头部删除元素 在尾部删除元素 查找固定元素 在链表中插入元素 在pos位置前插入 在pos位置后插入 删除链表结点 删除pos位置的结点 删除pos后的结点 链表的销毁 写在最后 前面我们学习了顺序表

    2024年02月20日
    浏览(40)
  • 【数据结构】单链表(详解)

    所属专栏:初始数据结构 博主首页:初阳785 代码托管:chuyang785 感谢大家的支持,您的点赞和关注是对我最大的支持!!! 博主也会更加的努力,创作出更优质的博文!! 关注我,关注我,关注我,重要的事情说三遍!!!!!!!! 前面我们已经用顺序表方式来实现接口

    2023年04月24日
    浏览(53)
  • 【数据结构】单链表(超全)

    前言:  上一次我们分享了线性表中的一种结构顺序表,它存在着一些其缺点,比如:在中间位置或者头部进行元素插入或者删除的时候时间复杂度是 O ( N ) O(N) O ( N ) 效率比较低,并且顺序表在扩容的时候也存在时间和空间上的消耗,由于我们每次都是按照二倍来扩的,那

    2024年02月11日
    浏览(41)
  • 数据结构--单链表

    目录 1.单链表的定义: 单链表基本操作的实现: 2.单链表的初始化(构造带头结点的空表) 2.将头结点的指针域置空 3.链表是否为空: 4.单链表的销毁: 5.单链表的清空: 6.求单链表的表长: 7.   取值  取单链表第i个元素: 8按值查找 根据指定数据查找指定数据所在位置序

    2024年02月15日
    浏览(42)
  • 数据结构单链表

    单链表 1 链表的概念及结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链 接次序实现的 。 在我们开始讲链表之前,我们是写了顺序表,顺序表就是类似一个数组的东西,它的存放是连续的,优点有很多,比如支持

    2024年02月12日
    浏览(45)
  • 数据结构:单链表

    单链表的全称为\\\"不带头单向不循环链表\\\" 注意:         下文提到的头节点与带头链表时两个概念,文中的头节点指的是第一个有效节点,二带头节点中的头指的是第一个无效节点 链表和顺序表一样,都是线性表,逻辑结构上是线性的,但不同的是,链表在物理结构上不是线性的

    2024年01月21日
    浏览(41)
  • 数据结构—单链表

    目录 1.前言 2.了解单链表 3.单链表代码实现       3.1 单链表结构体实现       3.2 创建节点       3.3  打印单链表       3.4 尾插        3.5  头插        3. 6 头删       3.7  尾删       3.8  查找       3.9  插入            3.9.1 在pos位置之前插入             3.9.

    2023年04月20日
    浏览(105)
  • 数据结构——单链表(下)

    🌇个人主页:_麦麦_ 📚今日名言:年轻时候的我以为坚持是永不动摇,到这个年纪明白了坚持就是犹疑着,退缩着,心猿意马着,一步三停着,还在往前走。——《十二月历》 目录 一、引言  二、单链表剩余功能的实现         1.单链表的查找         2. 单链表指定位

    2024年01月17日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包