LCR 140. 训练计划 II

给定一个头节点为 head 的链表用于记录一系列核心肌群训练项目编号,请查找并返回倒数第 cnt 个训练项目编号。

示例 1:

输入:head = [2,4,7,8], cnt = 1
输出:8

解题思路

  • 初始化: 前指针 former 、后指针 latter ,双指针都指向头节点 head 。
  • 构建双指针距离: 前指针 former 先向前走 cnt 步(结束后,双指针 former 和 latter 间相距 cnt 步)。
  • 双指针共同移动: 循环中,双指针 former 和 latter 每轮都向前走一步,直至 former 走过链表 尾节点 时跳出(跳出后,latter 与尾节点距离为 cnt−1cnt-1cnt−1,即 latter 指向倒数第 cnt 个节点)。
func trainingPlan(head *ListNode, cnt int) *ListNode {
      var fast, slow = head, head
      
      for i := 0; i < cnt; i++ {
          fast = fast.Next
      }
      
      for fast.Next != nil {
          fast = fast.Next
          slow = slow.Next
      }
      
      return slow.Next
}