赞
踩
来源于「Krahets」的《图解算法数据结构》
https://leetcode.cn/leetbook/detail/illustration-of-algorithm/
训练计划 II
给定一个头节点为 head 的链表用于记录一系列核心肌群训练项目编号,请查找并返回倒数第 cnt 个训练项目编号。
示例 1:
输入:head = [2,4,7,8], cnt = 1 输出:8
提示:
1 <= head.length <= 100 0 <= head[i] <= 100 1 <= cnt <= head.length
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* recuList(ListNode* cur, int* pcnt) { if(!cur) return nullptr;//递归终止条件:遍历到最后一个节点 ListNode* res = recuList(cur->next, pcnt);//进行递归传参 //如果计数还没减就为0了,说明前面已经找到了正确的结果,直接使用正确的函数返回值返回 if(*pcnt == 0) return res; //否则就是还没找到正确结果,递减计数器并判断本轮节点是否就是要找的节点 --(*pcnt); if(*pcnt == 0) return cur; //本轮未找到正确的元素,返回空 return nullptr; } ListNode* trainingPlan(ListNode* head, int cnt) { return recuList(head, &cnt); } };
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ //快慢指针 class Solution { public: ListNode* trainingPlan(ListNode* head, int cnt) { ListNode* fast = head; ListNode* low = head; for(int i=cnt; i>0; --i){ fast = fast->next; } while(fast){ fast = fast->next; low = low->next; } return low; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。