题目描述:输入一个链表,输出该链表中倒数第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
同样是使用快慢双指针解决的链表问题还有: