链表相关的算法题大汇总 (1)— 数据结构之链表奇思妙想
声明:转自http://hi.baidu.com/lanxuezaipiao/item/afc616caf8393a155050585b
基本函数(具体代码实现见后面)
1,构造节点
//定义节点类型
struct Node
{
int value;
Node*next;
};
2,分配节点
//之所以要分配节点原因是需要在分配函数中进行初始化,并且也利于判断是否分配成功。
Node* applyNode();
3,在头部增加节点
//增加节点在头部(无头结点),返回值的原因是由于传入并非指针的引用。
Node* addNodeH(Node* Head,Node* InsertNode);
4,在尾部增加节点
//增加节点在尾部(无头结点),返回值的原因是由于传入并非指针的引用。
Node* addNodeT(Node* Head,Node* InsertNode);
5,以升序方式增加节点
Node* addNodeSort(Node* Head,Node* InsertNode);
6,构造链表
//没有额外的表头结点。
//选择参数choose分别对应以何种方式构造链表,1为头部增加节点;2为尾部增加节点;3为升序增加节点。
Node* createList(int n,int choose);
7,打印链表
void printList(Node*Head);
8,释放链表
void freeList(Node*& Head);
9,链表节点数
int numOfNodes(Node* Head);
10,定位函数
//传入参数i表示第几个节点(从1开始),返回该节点指针
Node* locateNodeI(Node*Head,int i);
11,查找函数
//查找值为value的链表
int SearchList(Node*Head,int value);
12,删除节点
//删除位置i的节点
bool deleteNodeI(Node*&Head,int i);
13,排序函数
//冒泡排序链表,具体的做法是“狸猫换太子”,即只交换节点中的值,对链表结构不做改动。
void sortList(Node*& Head);
基本函数代码:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2,分配节点
//分配节点
//将分配内存和初始化该节点放在一个函数中
Node* applyNode()
{
Node* newNode;
if((newNode=(Node*)malloc(sizeof(Node)))==NULL)
{
cout<<"分配内存失败!"<<endl;
::exit(0);
}
//建立该节点信息:
cout<<"请输入本节点值:"<<endl;
cin>>newNode->value;
newNode->next=NULL;
return newNode;
}
3,在头部增加节点
//在表头增加节点
//在头指针所指向的链表中增加一个节点,插入头部
//这里必须要返回Node*来进行更新,因为传入的Head是Node*类型,而非Node*&
Node* addNodeH(Node* Head,Node* InsertNode)
{
if(Head==NULL)
{
Head=InsertNode;
}
else
{
InsertNode->next=Head;
Head=InsertNode;
}
return Head;
}
4,在尾部增加节点
//在表尾增加节点
//在头指针所指向的链表中增加一个节点,插入尾部
//这里必须要返回Node*来进行更新,因为传入的Head是Node*类型,而非Node*&
Node* addNodeT(Node* Head,Node* InsertNode)
{
if(Head==NULL)
{
Head=InsertNode;
}
else
{
Node* p=Head;
while(p->next!=NULL)
{
p=p->next;
}
p->next=InsertNode;
}
return Head;
}
5,以升序方式增加节点
//以升序增加节点
//这里必须要返回Node*来进行更新,因为传入的Head是Node*类型,而非Node*&
Node* addNodeSort(Node* Head,Node* InsertNode)
{
if(Head==NULL)
{
Head=InsertNode;
}
else
{
Node* p=Head;
//注意,这里把(p->value)<(InsertNode->value)放在p->next!=NULL前面是有原因的,这是避免为了考虑在Head->[4]加入[1]的情况
while((p->value)<(InsertNode->value)&&p->next!=NULL)
{
p=p->next;
}
if((p->value)>=(InsertNode->value))//因为((p->value)>=(InsertNode->value))而退出!表示在p前增加节点(狸猫换太子)
{
//先在p后增加节点
InsertNode->next=p->next;
p->next=InsertNode;
//再交换p和InsertNode的值
swap(p->value,InsertNode->value);
}
else//因为(p->next==NULL)而退出!表示在尾增加节点
{
p->next=InsertNode;
}
}
return Head;
}
6,构造链表
//建立n个节点的链表 choose=1,在表头加入,choose=2在表尾加入,choose=3按value值升序加入
Node* createList(int n,int choose)
{
Node *Head=NULL,*p=NULL;
for(int i=0;i<n;i++)
{
p=applyNode();
if(choose==1)
{
Head=addNodeH(Head,p);
}
else if(choose==2)
{
Head=addNodeT(Head,p);
}
else if(choose==3)
{
Head=addNodeSort(Head,p);
}
}
return Head;
}
7,打印链表
//遍历链表并输出
void printList(Node*Head)
{
Node*p=Head;
while(p!=NULL)
{
cout<<p->value<<"->";
p=p->next;
}
cout<<"NULL"<<endl;
}
8,释放链表
//释放链表
void freeList(Node*& Head)
{
Node* tmp=Head;
while(tmp!=NULL)
{
Head=Head->next;
free(tmp);
tmp=Head;
}
Head=NULL;
}
9,链表节点数
//数节点个数
int numOfNodes(Node* Head)
{
int count=0;
while(Head!=NULL)
{
count++;
Head=Head->next;
}
return count;
}
10,定位函数
//定位第i个节点,i从1开始
Node* locateNodeI(Node*Head,int i)
{
//cout<<"定位"<<i<<"位置"<<endl;
Node* pos=NULL;
int count=numOfNodes(Head);
if(i<=0||i>count)
{
cout<<"定位越界!"<<endl;
}
else
{
pos=Head;
for(int j=1;j<i;j++)
{
pos=pos->next;
}
}
return pos;
}
11,查找函数
//查找值value并返回第一个出现该值的位置,如果需要引用其指针,可以再locate该位置
int SearchList(Node*Head,int value)
{
Node* p=Head;
int pos=0;
bool find=false;
while(p!=NULL)
{
pos++;
if(p->value==value)
{
find=true;
break;
}
p=p->next;
}
if(find)
return pos;
else
return -1;
}
12,删除节点
//删除某位置i的节点
bool deleteNodeI(Node*&Head,int i)
{
Node* p=locateNodeI(Head,i);
if(p==NULL)
{
return false;
}
else
{
if(p==Head)//说明p是头节点。
{
Head=p->next;
free(p);
}
else
{
Node* prep=locateNodeI(Head,i-1);//定位前一个,必定存在
prep->next=p->next;
free(p);
}
return true;
}
}
13,排序函数
//链表排序
//排序的方法是不破坏结构,有“狸猫换太子”的意思,只进行value的交换,不破坏链表结构
void sortList(Node*& Head)
{
int count=numOfNodes(Head);
if(count==0||count==1)
{
return ;
}
//冒泡排序
bool exchange;
for(int i=2;i<=count;i++)
{
exchange=false;
for(int j=count;j>=i;j--)
{
Node* p1=locateNodeI(Head,j);
Node* p2=locateNodeI(Head,j-1);
if(p1->value<p2->value)
{
exchange=true;
swap(p1->value,p2->value);
}
}
if(!exchange)
break;
}
}
链表相关的算法题大汇总 (1)— 数据结构之链表奇思妙想相关推荐
- 链表相关的算法题大汇总 — 数据结构之链表奇思妙想
http://blog.csdn.net/lanxuezaipiao/article/details/22100021 基本函数(具体代码实现见后面) 1,构造节点 //定义节点类型 struct N ...
- 互联网公司最常见的面试算法题大集合!
转载于 新智元 来源:Github 编辑:元子 [导读]LeetCode是一个美国的在线编程网站,收集了各个大厂的笔试面试题,对找工作的毕业生和开发者来说,非常有价值.很多求职者都会在Leet ...
- 2020年护士执业资格考试真题大汇总,建议收藏!
相信大家目前最关心的就是今年护士执业资格考试的真题答案解析的事情了,为了给同学们一个靠谱的答案,咱们的老师在考后一直加班加点地给大家解析真题. 现在小赛把真题及解析大汇总免费分享给大家,同学们一定要收 ...
- python 单链表是否有回路_(Python3)数据结构--单链表之判断链表是否有环
前言 有Python基础 有数据结构单链表基础,没接触过的可以看下面链接 https://blog.csdn.net/sf9898/article/details/104946291 原理和实现 有一 ...
- 阶乘相关的算法题,东哥又整活儿了
学算法认准 labuladong 东哥带你手把手撕力扣???? 点击下方卡片即可搜索???? 读完本文,你可以去 LeetCode 上拿下如下题目: 172.阶乘后的零(难度 Easy) 793.阶乘 ...
- 链表python笔试题目_python经典面试算法题1.4:如何对链表进行重新排序
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.4 对链表按照如下要求重新排序 [微软笔试题] 难度系数: ...
- leetcode算法题--合并两个排序的链表
原题链接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/ ListNode* mergeTwoL ...
- 198道K8sDocker面试真题大汇总,全网最全八股!
最近看到两个数据,想跟你们分享一下: 一是,目前云原生开发人员已经达680万(SlashData数据): 二是,云和容器技术首超Linux,成最受青睐技能(Linux基金会数据). 云原生的发展势头丝 ...
- 吊打面试官,笑对 2022 金三银四,2022年最全面试真题大汇总
为什么要公开这些面试题? 原因一: 身边从事 Java 开发的人员越来越多,很多朋友们,每次问我要相同的面试复习材料,已经让我疲于应付,索性整理出来,直接发链接给他们. 原因二: 节省招聘双方彼此的时 ...
- 2022必撸八股!198道K8s/Docker/DevOps面试真题大汇总
技术的发展和演进是不可逆的. 整个互联网从最开始的单体架构,到垂直架构,到SOA架构,一路演进到现在的以微服务.Service Mesh等云原生技术为代表的架构形态. 像阿里.字节等大厂,基本上都已经 ...
最新文章
- 论文笔记:[ICLR 2020] Tips for prospective and early-stage PhD students
- Python线程、进程、进程池、协程
- Extension field添加到CDS view上的技术实现
- 微信公众号回调java_处理微信公众号消息回调
- 获取referer中的请求参数_Servlet获取AJAX POST请求中参数以form data和request payload形式传输的方法...
- 一起学习C语言:结构体(二)
- C语言课后习题(11)
- 刷题笔记(1) 一个序列是否为二叉搜索树的遍历结果
- 移动通信-抗衰落技术
- 【android开发】实现语音数据实时采集/播放
- JAVA 使用SSH/springboot集成 CXF框架发布Webservice
- C指针原理(32)--C语言-pvm并行计算
- kermit配置文件
- return 不能跳出 forEach 循环
- 纽约大学研究生 计算机科学 申请,纽约大学计算机科学硕士排名第35(2020年TFE Times排名)...
- 文笔极佳的郭靖夫妇悼文
- 沐神《动手学深度学习》使用笔记
- 第四章 软件架构演化
- nodeJs 接收上传文件
- 杨幂 AI 换脸:你上传的照片,正在出卖你!