常见的链表题目及代码(很好的代码格式)

 

一些常见的单链表题目,总结思路和实现代码。

1.单链表的反序

2.给单链表建环

3.检测单链表是否有环

4.给单链表解环

5.检测两条链表是否相交

6.不输入头节点,删除单链表的指定节点(只给定待删除节点指针)

 

1.单链表的反序

  1. //逆转链表,并返回逆转后的头节点   
  2. node* reverse(node *head)  
  3. {  
  4.     if(head == NULL || head->next == NULL)  
  5.     {  
  6.         return head;  
  7.     }  
  8.     node *cur = head;  
  9.     node *pre = NULL;  
  10.     node *tmp;  
  11.     while(cur->next)  
  12.     {  
  13.         tmp = pre;  
  14.         pre = cur;  
  15.         cur = cur->next;  
  16.         pre->next = tmp;                  //操作pre的next逆转   
  17.     }  
  18.     cur->next = pre;                     //结束时,操作cur的next逆转   
  19.     return cur;  
  20. }  

2.给单链表建环

  1. //给单链表建环,让尾指针,指向第num个节点,若没有,返回false   
  2. bool bulid_looplink(node *head, int num)  
  3. {  
  4.     node *cur = head;  
  5.     node *tail = NULL;  
  6.     int i = 0;  
  7.     if(num <= 0 || head == NULL)  
  8.     {  
  9.         return false;  
  10.     }  
  11.     for(i = 1; i < num; ++i)  
  12.     {  
  13.         if(cur == NULL)  
  14.         {  
  15.             return false;  
  16.         }  
  17.         cur = cur->next;  
  18.     }  
  19.     tail = cur;  
  20.     while(tail->next)  
  21.     {  
  22.         tail = tail->next;  
  23.     }  
  24.     tail->next = cur;  
  25.     return true;  
  26. }  

3.检测单链表是否有环

  1. //检测单链表是否有环,快慢指针   
  2. bool detect_looplink(node *head)  
  3. {  
  4.     node *quick_node = head->next, *slow_node = head;  
  5.     if(head == NULL || head->next == NULL)  
  6.     {  
  7.         return false;  
  8.     }  
  9.     while(quick_node != slow_node)  
  10.     {  
  11.         if(quick_node == NULL || slow_node == NULL)  
  12.             break;  
  13.         quick_node = quick_node->next->next;  
  14.         slow_node = slow_node->next;  
  15.     }  
  16.     if(quick_node != NULL && slow_node != NULL)    //非尾节点相遇   
  17.         return true;  
  18.     return false;  
  19. }  

4.给单链表解环

ps:为了增加节点位图的效率,本应使用hash或则红黑树,这里不造车了,直接用 set容器

  1. //找到有环节点,并解环,找到并解环,返回true,无环,返回false   
  2. //思路:先找到环节点:被2个节点指向的节点(一定有环的条件)ps:不考虑中间环,因为只有一个next节点,只可能是尾环   
  3. bool unloop_link(node *head)  
  4. {  
  5.     set<node *> node_bitmap;        //node的地址位图   
  6.     unsigned int num = 0;  
  7.     node *cur = head, *pre = NULL;  
  8.     while(cur != NULL)  
  9.     {  
  10.         if(!node_bitmap.count(cur) )              //该节点未被遍历过   
  11.         {  
  12.             node_bitmap.insert(cur);  
  13.             ++num;  
  14.         }  
  15.         else                               //指向已被遍历过的节点,此时pre节点为尾节点   
  16.         {  
  17.             pre->next = NULL;  
  18.             return true;  
  19.         }  
  20.         pre = cur;  
  21.         cur = cur->next;  
  22.     }  
  23.     return false;  
  24. }  

5.检测两条链表是否相交

  1. //检测两条链表是否相交,是则返回第一个交点,否则返回NULL   
  2. //思路:把2个链表各遍历一遍,记下长度length1和length2,若2者的尾节点指针相等,则相交。   
  3. //       之后再把长的链表从abs(len1-len2)的位置开始遍历,第一个相等的指针为目标节点   
  4. node* detect_intersect_links(node *first_link, node *second_link)  
  5. {  
  6.     int legnth1 = 1, length2 = 1, pos = 0;  
  7.     node *cur = NULL, *longer_link = first_link, *shorter_link = second_link;  
  8.     if(first_link == NULL || second_link == NULL)  
  9.     {  
  10.         return NULL;  
  11.     }  
  12.     while(first_link->next || second_link->next)     //遍历2个链表   
  13.     {  
  14.         if(first_link->next)  
  15.         {  
  16.             first_link = first_link->next;  
  17.             ++legnth1;  
  18.         }  
  19.         if(second_link->next)  
  20.         {  
  21.             second_link = second_link->next;  
  22.             ++length2;  
  23.         }  
  24.     }  
  25.     if(first_link != second_link)                 //比较尾节点   
  26.     {  
  27.         return NULL;  
  28.     }  
  29.     pos = legnth1 - length2;  
  30.     if(legnth1 < length2)                  //保证 longer_link为长链表   
  31.     {  
  32.         pos = length2 - legnth1;  
  33.         cur = longer_link;  
  34.         longer_link = shorter_link;  
  35.         shorter_link = cur;  
  36.     }  
  37.     while(pos-- > 0)  
  38.         longer_link = longer_link->next;  
  39.     while(longer_link || shorter_link)  
  40.     {  
  41.         if(longer_link == shorter_link)                  //找到第一个交点   
  42.         {  
  43.             return longer_link;  
  44.         }  
  45.         longer_link = longer_link->next;  
  46.         shorter_link = shorter_link->next;  
  47.     }  
  48.     return NULL;  

6.不输入头节点,删除单链表的指定节点(只给定待删除节点指针)

  1. //无头节点,随机给出单链表中一个非头节点,删除该节点,当传入空节点,或者尾节点时,返回false   
  2. //思路:由于没有头节点,非循环单链表,无法获取目标节点的前节点,所以只能把它的next节点数据前移,并删除next节点   
  3. //ps:当传入节点为尾节点,无法用此方法删除   
  4. bool withouthead_delete_node(node *target_node)  
  5. {  
  6.     node *cur = NULL;  
  7.     if(target_node == NULL || target_node->next == NULL)   //空节点或者尾节点,失败   
  8.     {  
  9.         return false;  
  10.     }  
  11.     cur = target_node->next;  
  12.     target_node->name = cur->name;  
  13.     target_node->next = cur->next;  
  14.     delete cur;  
  15.     return true;  
  16. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值