**给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。

示例 1:
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
示例 2:
输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。

提示:
给定链表的结点数介于 1 和 100 之间。**

这道题我最初想法是先求出链表长度len,然后借鉴了链表中倒数第k个节点这个办法分奇偶使head移动到了相应节点位置;代码如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode* middleNode(struct ListNode* head)
{int len=0;int n,i;struct ListNode* p=head;while(p!=NULL){len++;p=p->next;}struct ListNode* q=head;if(len%2==0){n=len/2;while(n--){q=q->next;}}else{n=len/2+1;while(n--){q=q->next;}}while(q!=NULL){q=q->next;head=head->next;}return head;
}

这个方法有点麻烦,我看到有很多用双指针的方法,其中一个p指针一次移动两个节点,另一个q移动一个节点,最后q节点的位置就是所要的位置;这个方法确实很巧妙,我还是太菜没有想出来,代码如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode* middleNode(struct ListNode* head)
{struct ListNode* p=head;struct ListNode* q=head;while(p!=NULL&&p->next!=NULL){p=p->next->next;q=q->next;}return q;
}

这个就很简洁了;

在写这个代码的时候遇到了一个问题,有必要记录一下:

1 while(p!=NULL&&p->next!=NULL)

2 while(p->next!=NULL&&p!=NULL)

这两个循环判断中只是前后顺序不一样,但是第二个就会报错:

这个问题是关于空指针的问题,即编译器不知道你使用的是不是空指针中的元素;
2这里,编译器会优先处理p->next!=NULL,而编译器并不清楚p是否为空,所以无法执行该语句;
1这里,编译器就先判断了p是否为空,然后就可以继续往下判断p->next是否为空了;

876. 链表的中间结点(C语言)相关推荐

  1. LeetCode Algorithm 876. 链表的中间结点

    876. 链表的中间结点 Ideas 这题直接秒杀吧,快慢指针,快指针一次走两步,慢指针一次走一步,快指针到头之后慢指针正好到链表中间. Code C++ class Solution {public ...

  2. LeedCode篇:876. 链表的中间结点

    876. 链表的中间结点 题目: 解题思路: 源码 踩坑点: 题目: 解题思路: 因为要找中间节点,所以用快慢指针的方法 源码 struct ListNode* middleNode(struct L ...

  3. LeetCode-876. 链表的中间结点 C语言

    876. 链表的中间结点 给定一个头结点为 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5] 输出:此列表中的结点 3 ...

  4. LeetCode刷题 876链表的中间结点

    876. 链表的中间结点 难度简单550收藏分享切换为英文接收动态反馈 给定一个头结点为 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[ ...

  5. [C题目]力扣876. 链表的中间结点

    876. 链表的中间结点 - 力扣(LeetCode)  方法一:计算结点个数count,挪动count/2次就是题目要求的结点. struct ListNode* middleNode(struct ...

  6. LeetCode Java刷题笔记—876. 链表的中间结点

    876. 链表的中间结点 给定一个头结点为 head 的非空单链表,返回链表的中间结点.如果有两个中间结点,则返回第二个中间结点. 简单难度.使用快慢指针即可,快指针fast每次走2步,慢指针slow ...

  7. 每日一道leetcode(python)876. 链表的中间结点

    每日一道leetcode(python)876. 链表的中间结点 2021-08-19 给定一个头结点为 head 的非空单链表,返回链表的中间结点.如果有两个中间结点,则返回第二个中间结点.示例 1 ...

  8. JavaScript——leetcode算法入门876. 链表的中间结点【双指针专题】

    题目描述 给定一个头结点为 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形式: ...

  9. 【LeetCode题目详解】(二)206.反转链表、876.链表的中间结点

    目录 一.力扣第206题:反转链表 1.思路一 2.思路二 二.力扣第876题:链表的中间结点 1.思路一 2.思路二 总结 一.力扣第206题:反转链表 题目链接:206. 反转链表 - 力扣(Le ...

最新文章

  1. CSP认证201409-3 字符串匹配[C++题解]:字符串处理
  2. Database之SQLSever:SQL命令实现的高级案例集合之单表/多表(筛选、统计个数)之详细攻略
  3. 用静态工厂方法代替构造器
  4. php动态数组的用法
  5. 购物车的数据应该保存在哪?
  6. 打印异常堆栈_通过异常堆栈丢失谈即时编译优化
  7. 状态压缩动态规划 - 总结【普及+,提高-】
  8. RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍
  9. [bzoj3527][Zjoi2014]力
  10. 一主多备几影响 oracle,1个主库配置多个备库的问题
  11. JEP JAVA 初体验
  12. android 互传文件,堪比隔空投送!iPhone和安卓、PC互传文件的3种方法,建议收藏...
  13. 信息收集----谷歌语句
  14. CentOS 7下atime如何变化的问题(转)
  15. Arduino零基础实践——1
  16. 大学物理 狭义相对论 思维导图总结
  17. android只编译release版本
  18. 计网homework
  19. createJs继承
  20. 用JS描述的数据结构及算法表示——栈和队列(基础版)

热门文章

  1. useradd -g mysql mysql_Linux —— useradd -g mysql mysql解析及useradd详解
  2. android中暂停服务,Android暂停服务,线程,Asynctask?使用postdelayed的处理程序呢?...
  3. html加上 extjs右键,extjs 处理HTML事件和自定义事件
  4. 超大型数据中心阻碍5G的正常发挥?
  5. android+p+华为手机,给1.9亿用户32款老机型进行安卓P升级 华为值吗?
  6. ML之sklearn:sklearn.linear_mode中的LogisticRegression函数的简介、使用方法之详细攻略
  7. DL之Xception:Xception算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  8. DL之DNN优化技术:DNN中抑制过拟合/欠拟合、提高泛化能力技术的简介、使用方法、案例应用详细攻略
  9. DL之CNN:基于CNN-RNN(GRU,2)算法(keras+tensorflow)实现不定长文本识别
  10. TF之DD:利用Inception模型+GD算法生成更高质量的Deep Dream高质量图片