《剑指offer》【链表中倒数第k个节点】(python版)

题目描述:输入一个链表,输出该链表中倒数第k个结点。
思路:看到本题我们很自然的一个想法是从尾结点往前倒退k步,但是对于单链表是行不通的。那我们换个思路,假设链表有n个结点,要求倒数第k个结点,其实也就是从前往后数第n-k+1个结点,这个思路只需要遍历两次链表即可。
  有没有只遍历一次链表的方法呢?本题其实是很典型的快慢双指针问题,快指针先走k步,然后快慢指针再同时往前走,当快指针走到尽头时,慢指针刚好在倒数第k个节点的位置上。这样只需要遍历一次链表即可。唯一需要注意的问题是小心参数k值大于链表长度。

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def FindKthToTail(self, head, k):
        # write code here
        pre = post = head
        # 快指针先走k步
        for i in range(k):
            # 如果k大于链表长度,返回空
            if pre == None:
                return None
            pre = pre.next
        # 快慢指针同时往前走
        while pre != None:
            pre = pre.next
            post = post.next
        return post

同样是使用快慢双指针解决的链表问题还有:

《剑指offer》【链表中环的入口】(python版)

《剑指offer》【两个链表的第一个公共结点】(python版)

猜你喜欢

转载自blog.csdn.net/qq_20141867/article/details/80919029
今日推荐