这道题对我来说难点就是临界点不好找,总是找不准慢指针啥时候开始移动,还有就是如果链表的长度不够k咋办的情况,最终的代码如下:
class ListNode:
def __init__(self, data):
self.val = data
self.next = None
class Solution:
def FindKthTail(self, head, k):
// 验证参数的合理性
if head is None or k < 1:
return None
// 初始化数据
first, second = head, head
setp = 0
// 真正的逻辑
while first.next is not None:
first = first.next
step += 1
if step >= k:
second = second.next
// 最终的验证
if step >= k - 1:
return second
else:
return None
这道题使用前后两个指针,他们之间的距离是k - 1,这样当前面的指针指向最后一个节点时,后面的指针指向的就是倒数第k个,如图:
最开始时两个指针都指向头节点:
紧接着第一个指针开始移动,当第一个指针移动的步数等于k时,第二个指针开始移动,以后在满足条件的情况下两个指针都移动一下,整个过程如下图:
最后返回第二个指针指向的节点即可,但是还需要判断一下,此时走过的步数是否大于等于k,如果链表的长度太短的时候会出错,如下图:
最终第二个指针指向的还是头结点,但是这并不是倒数第k个节点,这就需要返回None