本博文内容为单链表相关的笔试题,转载请注明转载处,否则必究

1. 合并两个有序的单链表成一个有序的单链表

方法分为递归实现与非递归实现,两种方法都不额外开辟 内存空间

链表的数据结构在本博客的单链表逆转,约瑟夫环等

递归实现:

//递归实现合并两个有序单链表
LinkNode* merge_list(LinkNode *pHead1, LinkNode *pHead2)
{if(pHead1==NULL)return pHead2;if(pHead2==NULL)return pHead1;if(pHead1==NULL && pHead2==NULL)return NULL;LinkNode *pMergedHead=NULL;if(pHead1->value<pHead2->value){pMergedHead=pHead1;pMergedHead->next = merge_list(pHead1->next, pHead2);}else {pMergedHead=pHead2;pMergedHead->next=merge_list(pHead1, pHead2->next);}return pMergedHead;
}

非递归实现:

//非递归实现合并两个有序单链表(不额外开辟空间)
LinkNode* non_merge_list(LinkNode *pHead1, LinkNode *pHead2)
{if(pHead1==NULL)return pHead2;if(pHead2==NULL)return pHead1;if(pHead1==NULL && pHead2==NULL)return NULL;LinkNode *pMergedHead = NULL;LinkNode *q=NULL;if(pHead1->value<pHead2->value){pMergedHead=pHead1;pHead1=pHead1->next;}else{pMergedHead=pHead2;pHead2=pHead2->next;}   q=pMergedHead;while(pHead1 && pHead2){if(pHead1->value<pHead2->value){q->next=pHead1;pHead1=pHead1->next;}else{q->next=pHead2;pHead2=pHead2->next;}q=q->next;}if(pHead1){while(pHead1){q->next=pHead1;q=q->next;pHead1=pHead1->next;}}if(pHead2){while(pHead2){q->next=pHead2;q=q->next;pHead2=pHead2->next;}}return pMergedHead;
}

2 输出单链表中的中间元素(若链表节点个数为偶数,则输出中间两个的任意一个)

思路:利用两个指针从头节点开始遍历,一个走一步,一个走两步,当一次走两步的指针走到链表末尾时,此时一次走一步的指针就指向链表的中间节点

代码如下:

LinkNode* print_mid_node(LinkNode *pHead)
{LinkNode *pOne = pHead, *pTwo = pHead;while(1)   {pOne = pOne->next;pTwo = pTwo->next->next;if(pTwo==NULL || pTwo->next==NULL)return pOne;}
}

3 判断单恋表是否有环

思路与第二题一样,只是结束条件不一样,如果当一次走一步的指针等于一次走两步的指针时,则表示该链表有环

代码如下:

bool is_circle_list(LinkNode *pHead)
{LinkNode *pOne = pHead, *pTwo = pHead;while(1){pOne = pOne->next;pTwo = pTwo->next->next;if(pOne == pTwo)return true;if(pTwo==NULL || pTwo->next==NULL)return false;}
}

合并单链表,输出单链表中间元素,判断是否有环等相关推荐

  1. 倒序输出单链表的内容

          单链表是最简单的数据结构,同时也是最常接触的数据结构,这个问题也很常见,通常这个问题我们有两种解决办法.       1.逆置单链表之后输出       这篇文章讲述了这样的过程 http ...

  2. c语言输出单链表最大值与最小值,数据结构(C语言版)---顺序表与链表的比较...

    1.存取方式 1)顺序表:可以顺序存取,也可以随机存取. 2)链表:只能从表头顺序存取. 2.逻辑结构与物理结构 1)顺序存储:逻辑上相邻,物理位置相邻. 2)链式存储:逻辑上相邻,物理位置不一定相邻 ...

  3. 使用递归顺序和逆序输出单链表

    分析如何缩小问题规模.(递归体) 将链表分成两部分,头节点和剩余节点,再将剩余节点分解成剩余节点的头节点和剩余节点······ 分析结束条件 使问题无法再继续分解时的条件 顺序输出链表 void pr ...

  4. 用剥洋葱理解递归逆序输出单链表

    题目要求:从最里层开始,依次往外拔掉每一层的洋葱 假设带头结点(最外层看做头结点L) void Reverse(Linklist L){ 第一步,判断L后边还有没有,有的话才能往下剥,没有的话程序en ...

  5. 链表的各种操作实现 链表逆序 链表排序 有序链表归并 链表存在环的判定

    链表的各种操作实现 链表逆序 链表排序 有序链表归并 链表存在环的判定 链表基本操作实现 c语言版本, 该程序在visual c++ 6.0上调试通过! 本人写该程序完全是为学习交流之用,还望大家多多 ...

  6. java链表实现_链表的原理及java实现

    一:单向链表基本介绍 链表是一种数据结构,和数组同级.比如,Java中我们使用的ArrayList,其实现原理是数组.而LinkedList的实现原理就是链表了.链表在进行循环遍历时效率不高,但是插入 ...

  7. C语言之链表:单向链表,循环链表,双向链表

    C语言之链表:单向链表,循环链表,双向链表 提起链式存储结构,其与数组是两个非常基础的数据结构,每当提到链式存储结构时,一般情况下我们都会将其与数组放到一块儿来比较. 对于数组与链表,从结构上来看,数 ...

  8. 【区块反转】【链表合并】【反转链表】【链表元素分类】【链表去重】【重排链表】

    目录 说明: 1110 区块反转 输入格式: 输出格式: 输入样例: 输出样例: 1105 链表合并 输入格式: 输出格式: 输入样例: 输出样例: 1025 反转链表 输入格式: 输出格式: 输入样 ...

  9. 查找单链表倒数第k个元素

    题目要求: 简单来说就是用高效的算法来求倒数第k个元素. 方法1: 就先遍历一遍求出单链表的长度,用单链表的长度减去k,即为从前往后要走走的步数.走了n+n-k次. int length(Linkli ...

最新文章

  1. kubernetes资源对象之security context
  2. android 对比win10 耗电,win10系统下像何查看耗电的应用程序
  3. 学习 shell —— 条件判断 if 的参数
  4. 计算机三级er图怎么画,visio2013怎么画ER图?
  5. SDH传输分析仪是什么?
  6. 开发如何转型做项目管理
  7. 2000坐标系xy坐标几位_2000国家大地坐标系简介
  8. 学习笔记 Tianmao 篇 SwipeRefreshLayoyt 下拉刷新 控件 使用
  9. Latex中PDF文档目录乱码解决方案
  10. ShareTech大企业邮件服务器系统软件
  11. 转帖(http://hi.baidu.com/johnehuang/blog/item/e1e96782a4b04e97f703a6dc.html)
  12. 名帖104 赵孟頫 楷书《崑山州淮云院记》
  13. [pwnable.kr]shellshock
  14. 我的世界它最懂 华为nova7系列打造5G自拍旗舰
  15. android 点击按钮来回切换图片
  16. MySQL 创建数据库/表/字段
  17. 完美的正方形分割(二)
  18. 《大学四年》——知乎 读书笔记
  19. 时间戳转换为日期格式 C/C++ 学习日记 新手讲解
  20. 【GZOJ】1369——小明跳楼梯

热门文章

  1. python函数参数定义顺序_Python函数定义-位置参数-返回值
  2. qwidget多个窗口同步_【好人BUG】本机多组控制 一台电脑使用一个帐号登录多个(省钱) !...
  3. 计算机应用基础在线测试01,计算机应用基础在线测试(全部正确).pdf
  4. android app 主界面,android ViewPager实现App主界面Tab菜单页面切换和点击事件
  5. Django框架基础知识点
  6. C#宿舍管理系统数据库
  7. UDP 无连接上机案例3.4
  8. python vscode_VScode || 为VScode配置python环境
  9. void类型和void *的用法
  10. 08-数组中常用的属性及方法