数据结构 链表 奇思妙想.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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.删除无头单链表的一个节点 思路:

文档评论(0)

189****6649 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档