链表的中间结点数据结构oj题(力扣876)

目录

题目描述:

题目分析:

代码解决:


题目描述:

给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。

题目分析:

寻找中间节点这道题原理就是通过1/2总长度,对于我来说一开始想到的方法一 就是先计算内部有多少个节点,然后进行除以二,得到中间节点数后,进行遍历到对应的中间节点(本人有点笨,只能想到这种方法了)。通过向大佬学习,我发现一个更加好用的方法,思路二 就是快慢指针,这个快慢指针就是一个fast指针每次走两步,另一个low指针每次走一步,等fast出界时,low就是中间指针,这个方法是个好方法思路简单,代码也好写,就是难想出来哈哈哈。

代码解决:

思路一:

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {
    ListNode* n1, * n2;
    n1 = n2 = head;
    int count = 0;
    //遍历计算链表长度
    while (n1)
    {
        n1 = n1->next;
        count++;
    }
    //移动到中间链表
   count = count / 2;
   while (count)
   {
       n2 = n2->next;
       count--;
   }
    return n2;
}

思路二:

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {
    ListNode* fast = head;
    ListNode* low = head;
    while (fast != NULL && fast->next != NULL)
    {
        fast = fast->next->next;
        low = low->next;
    }
    return low;
}
相关推荐
_星辰大海乀41 分钟前
表的设计、聚合函数
java·数据结构·数据库·sql·mysql·数据库开发
林下清风~2 小时前
力扣hot100——347.前K个高频元素(cpp手撕堆)
算法·leetcode·职场和发展
小雅痞2 小时前
[Java][Leetcode middle] 238. 除自身以外数组的乘积
java·leetcode
进击的小白菜3 小时前
Java回溯算法解决非递减子序列问题(LeetCode 491)的深度解析
java·算法·leetcode
Swift社区4 小时前
涂色不踩雷:如何优雅解决 LeetCode 栅栏涂色问题
算法·leetcode·职场和发展
冠位观测者4 小时前
【Leetcode 每日一题】2900. 最长相邻不相等子序列 I
数据结构·算法·leetcode
y102121045 小时前
Pyhton训练营打卡Day27
java·开发语言·数据结构
daiwoliyunshang5 小时前
哈希表实现(1):
数据结构·c++
GG不是gg5 小时前
排序算法之高效排序:快速排序,归并排序,堆排序详解
数据结构·算法·排序算法