剑指 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.
解题思路:
- 第一时间想到的解法:
- 先遍历统计链表长度,记为 n ;
- 设置一个指针走 ( n − k ) (n-k) (n−k) 步,即可找到链表倒数第 k k k 个节点。
- 使用双指针则可以不用统计链表长度。
算法流程:
- 初始化: 前指针
former
、后指针latter
,双指针都指向头节点head
。 - 构建双指针距离: 前指针
former
先向前走 k k k 步(结束后,双指针 former 和 latter 间相距 k 步)。 - 双指针共同移动: 循环中,双指针
former
和latter
每轮都向前走一步,直至former
走过链表尾节点时跳出(跳出后,latter
与尾节点距离为 k − 1 k-1 k−1,即latter
指向倒数第 k 个节点)。 - 返回值: 返回
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
参考
以上是关于剑指 Offer 22. 链表中倒数第k个节点的主要内容,如果未能解决你的问题,请参考以下文章