输入一个链表,输出该链表中倒数第k个结点。
注意这题要求返回的是结点,不是结点的数值。
首先比较好想的思路就是,把列表遍历一遍,按要求在存储的列表里拿出来要求的结点
def FindKthToTail(self, head, k):
# write code here
if head == None or k==0:
return None
result = []
while head != None:
result.insert(0,head)
head = head.next
if k > len(result):
return None
return result[k-1]
还有一个思路就是双指针。
class Solution:
def FindKthToTail(self, head, k):
# write code here
if head == None or k<=0:
return None
fast = head
slow = head
# 让快指针先走
while k>1:
if fast.next != None:
fast = fast.next
k-=1
else:
return None
# 快慢指针一起走
while fast.next != None: # fast的下一个结点是空,说明该指针已经到达最末尾。
fast = fast.next
slow = slow.next
return slow
这个题主要的问题是不知道,链表的结尾在哪。如果直接用一个指针找到结尾之后, 由于是单向链表没办法回到溯第k个结点。
所以需要两个指针,快指针是为找到结尾,慢指针和快指针保持k-1的距离,快指针到达结尾时候,慢指针指向就是所要的结点。
快慢指针组成了一把尺子,想象尺子是怎么量东西的?把尺子和被测物体一端对齐,尺子另一端就是要的地方。
为什么尺子的长度是k- 1?这是因为快指针遍历到结尾的时候,它本身就是占有一个位置。举个极端的例子,如果k=1,就是取结尾的结点,快慢指针应该是没有距离的。