- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构 链表 奇思妙想
数据结构-链表-奇思妙想2010-12-14 22:06基本函数
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);
以上函数参见代码1。
高级函数
1.单链表反转
思路1:O(n^2).
我的做法是狸猫换太子,不进行改动链表结构,只首尾交换len/2次。但是在本函数中用到了定位函数,定位函数实际上是遍历了一遍整个链表,所以综合效率很低,达到O(n^2).
void reverseList(Node*Head)
思路2:O(n).
就最一般的情况而言(没有之前写的那么多辅助函数,即条件单纯为只有Head指向一个单链表)。那么可以实现O(n)效率。做法是用三个相邻的指针进行遍历,在遍历的途中,更改指针方向。当然要注意链表数目分情况,和拆链的处理。
Node*reverseList2(Node*Head)
2.找出单链表的倒数第4个元素
思路1:O(2n)
先遍历一遍链表记录节点个数。然后定位该位置count-3,定位函数实际上也是遍历一遍,所以总效率O(n)+O(n)
bool findLast4th1(Node*Head,intans)
思路2:O(n)
如果题目限制要求,仅允许遍历一遍,则可以按如下方法进行。先定义两个指针,第一个指针先走4步,然后从这时开始,第一个指针和第二个指针同时继续走,即第一个指针和第二个指针相差4步。则第二个指针到头时,第一个指针指向倒数第四个。注意要考虑链表长度。
bool findLast4th2(Node*Head,intans)
思路3:O(n)
做一个数组arr[4],让我们遍历单链表,把第1个、第5个、第9个…第4 N+1个扔到arr[0],把第2个、第6个、第10个…第4 N+2个扔到arr[1],把第3个、第7个、第11个…第4 N+3个扔到arr[2],把第4个、第8个、第12个…第4 N个扔到arr[3],这样随着单链表的遍历结束,arr中存储的就是单链表的最后4个元素,找到最后一个元素对应的arr[i],让k=(i+1)%4,则arr[k]就是倒数第4个元素。如果不易理解,画个图就好了。注意增加的空间只需要4个,所以是常数级的。比如加到第5个节点时就会把arr[0]中的值冲掉。
bool findLast4th3(Node*Head,intans)
3.找出单链表的中间元素
思路1:O(2n)
在函数的支持下,直接求整个链表的长度,然后定位中间元素。
bool getMiddleOne1(Node*Head,intans)
思路2:O(n)
如果仍要求只遍历一遍。类似于上题,还是使用两个指针first和second,只是first每次走一步,second每次走两步:
bool getMiddleOne2(Node*Head,intans)
4.删除无头单链表的一个节点
思路:
您可能关注的文档
最近下载
- 绿巨人学习_坡地建筑设计.pdf VIP
- 基于自适应的改进人工蜂群算法.docx VIP
- 2025-2025南大核心CSSCI目录.docx VIP
- 2025年中国合成生物制造产业发展白皮书.pdf VIP
- 2025年完整版)体育单招语文试题附答案 完整版520.pdf VIP
- 【Jefferies-2025研报】幻灯片:肥胖症相关公司在ADA会议及下半年的布局:安进、诺和诺德等.pdf
- 海南省建设工程项目经理(注册建造师)信用评价标准2025.pdf VIP
- 为旅行社产品定价课件(共21张PPT)《旅行社计调业务》(中国言实出版社).pptx VIP
- 《基于DFT的第一性原理计算方法简介》-姜俊.pdf VIP
- 《中国人民海军》课件.ppt VIP
文档评论(0)