首页 > 其他分享 >【刷力扣】876. 链表的中间结点

【刷力扣】876. 链表的中间结点

时间:2024-08-14 15:51:05浏览次数:12  
标签:结点 ListNode 876 head next 链表 刷力 指针

876.链表的中间结点
依旧是“力扣新手村”里的题,我的思路只有解法1,然而解法2更妙,学习学习!

解法1:单指针法

1.经过一次遍历求出链表的长度。
2.再次遍历找到链表的中间结点。

class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        int size = 0; // 记录链表长度
        ListNode* p = head;
        // 第一次遍历求出链表长度
        while (p) {
            p = p->next;
            size++;
        }
        // 再次遍历找到链表的中间结点
        size = size / 2;
        while (size--) {
            head = head->next;
        }
        return head;
    }
};

时间复杂度:\(O(N)\),其中\(N\)为链表结点数。
空间复杂度:\(O(1)\)。

解法2:双指针法

使用快慢指针的方法来解该题,慢指针走一步,快指针走两步,当快指针走到链表末尾时,慢指针所指链表结点即为链表中间结点。

class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        ListNode* slow = head;
        ListNode* fast = head;
        while (fast && fast->next) {
        	slow = slow->next;
            fast = fast->next->next;
        }
        return slow;
    }
};

时间复杂度:\(O(N)\),其中\(N\)为链表结点数。
空间复杂度:\(O(1)\)。

标签:结点,ListNode,876,head,next,链表,刷力,指针
From: https://www.cnblogs.com/Henfiu/p/18359121

相关文章

  • 【刷力扣】1342. 将数字变成 0 的操作次数
    1342.将数字变成0的操作次数这题是包含在“力扣新手村”里的题,按直接模拟的方法来写很简单。不过我一点儿都没有想到位运算的写法,看了看别人的题解,学习了一下下~解法1:直接模拟直接按题意模拟:1.判断num是否为0。2.num不为0,进行一次操作:(1)奇数:num=num-1;(2)偶数:num=num......
  • Leetcode 234.回文链表
    给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。示例1:输入:head=[1,2,2,1]输出:true示例2:输入:head=[1,2]输出:false提示:链表中节点数目在范围[1,105] 内0<=Node.val<=9进阶:你能否用 O(n) 时间复杂......
  • 对链表进行排序
    1publicclassSortLinkedList{//方法:对链表进行排序publicstaticListNodesortList(ListNodehead){//如果链表为空或只有一个节点,直接返回if(head==null||head.next==null){returnhead;}//使用......
  • 合并两个有序链表
    1、publicclassMergeTwoSortedLists{//方法:合并两个有序链表publicstaticListNodemergeTwoLists(ListNodel1,ListNodel2){//创建一个虚拟节点作为合并后链表的头节点ListNodedummy=newListNode(0);ListNodecurrent=du......
  • 数据结构之链表超详解(1)
     一人我饮酒醉醉把佳人成双对两眼是独相随只求他日能双归娇女我轻扶琴燕嬉我紫竹林痴情红颜心甘情愿千里把你寻说红颜我痴情笑曲动我琴声妙轻狂高傲懵懂无知只怪太年少弃江山我忘天下斩断情丝无牵挂千古留名传佳话我两年征战已白发一生征战何人陪谁是谁非谁相随戎马一......
  • 内核链表常用宏——container_of()
    定义#definelist_entry(ptr,type,member)\ container_of(ptr,type,member)#defineoffsetof(TYPE,MEMBER)((size_t)&((TYPE*)0)->MEMBER)#definecontainer_of(ptr,type,member)({ \ consttypeof(((type*)0)->member)*__mptr=(ptr); ......
  • [YM]模板-单链表(超详细简洁模板)
    概念:链表是一种用于存储数据的数据结构,通过如链条一般的指针来连接元素。它的特点是插入与删除数据十分方便,但寻找与读取数据的表现欠佳,复杂度几乎是O(n)但其还是有很大的重要性是数据结构的开端模板:题目概述:相信大家对于单链表的操作已经游刃有余了,我们知道,对于一个单......
  • 让程序既能正序也能逆序显示电影列表。使用双向链表
    /让程序既能正序也能逆序显示电影列表。使用双向链表/#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstructMovie{chartitle[100];structMovie*prev;structMovie*next;}Movie;typedefstructMovieList{Movie*head;......
  • 单链表与双链表的代码实现
    单链表链表的概念链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表比数组的优势在于,它可以提供高效的重排数据的能力。这种灵活性的代价是不能快速访问表中的任意数据项,访问链表中数据项的唯一方式是沿着链表,一个......
  • C++提高编程—4、STL常用容器—list(链表)和queue(队列)
    7list容器 7.1基本概念 7.2 构造函数 7.3 赋值和交换 7.4 大小操作  使用10000来填充。7.5 插入与删除 7.6 数据存取 7.7 反转与排序  8set/multset容器 7.1基本概念7.2 构造和赋值7.3大小和交换7.4 插入与删除7.5 查......