剑指 Offer 22. 链表中倒数第k个节点

Posted 炫云云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 22. 链表中倒数第k个节点相关的知识,希望对你有一定的参考价值。

剑指 Offer 22. 链表中倒数第k个节点

输入一个链表,输出该链表中倒数第 k k k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

示例:

给定一个链表: `1->2->3->4->5`, 和 k = 2.

返回链表 4->5.

解题思路:

  • 第一时间想到的解法:
  1. 先遍历统计链表长度,记为 n ;
  2. 设置一个指针走 ( n − k ) (n-k) (nk) 步,即可找到链表倒数第 k k k 个节点。
  • 使用双指针则可以不用统计链表长度。

算法流程

  1. 初始化: 前指针 former 、后指针 latter ,双指针都指向头节点 head
  2. 构建双指针距离: 前指针 former 先向前走 k k k 步(结束后,双指针 former 和 latter 间相距 k 步)。
  3. 双指针共同移动: 循环中,双指针 formerlatter 每轮都向前走一步,直至 former 走过链表尾节点时跳出(跳出后, latter 与尾节点距离为 k − 1 k-1 k1,即 latter 指向倒数第 k 个节点)。
  4. 返回值: 返回 latter 即可。
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def getKthFromEnd(self, head, k):
        """
        :type head: ListNode
        :type k: int
        :rtype: ListNode
        """
        former, latter = head, head
        for _ in range(k):
            if not former:
                return
            former = former.next
        while former:
            former , latter = former.next , latter.next
        return latter

参考

Krahets - 力扣(LeetCode) (leetcode-cn.com)

以上是关于剑指 Offer 22. 链表中倒数第k个节点的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer-代码的鲁棒性面试题22:链表中倒数第k个节点

剑指 Offer 22. 链表中倒数第k个节点

剑指 Offer 22. 链表中倒数第k个节点

力扣专题——剑指 Offer 22. 链表中倒数第k个节点

剑指 Offer 22. 链表中倒数第k个节点

剑指Offer打卡22. 链表中倒数第k个节点