思路
条件:就一个链表,要求我们输出该链表中倒数第k个结点
方法:双指针法
几个值得思考得问题
-
如何判断k值是否超过链表长度并且要考虑k=0的情况
提示:在q指针移动过程中判断k值是否超过链表长度,k=0情况单独列出来即可 -
极端情况:
链表为空,则返回None
代码
- 方法一:
# -*- 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
# 双指针尺子法
p = head
q = head
for i in range(k):
# 判断K是否超过了数组长度
if q == None:
return None
q = q.next
while q:
p = p.next
q = q.next
return p
- 方法二:
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param pHead ListNode类
# @param k int整型
# @return ListNode类
#
class Solution:
def FindKthToTail(self , pHead , k ):
# write code here
# 若链表为空或者k<=0则返回None
if not pHead or k <= 0:return None
# 初始化尺子的开始和结束
start = pHead
end = pHead
# 形成尺子
for i in range(k-1):
if end.next:
end = end.next
else:
return None
# 尺子移动,这里一定要注意循环结束的条件,在纸上画一画
while end.next:
start = start.next
end = end.next
return start
总结一个链表的小技巧
- 判空一定是当前指针指到了链表最后一个结点的next,而不是最后一个结点,要多判断一次
- 画图更容易理解