题目描述
输入一个链表,输出该链表中倒数第k个结点。
解题思路
Low1:循环两次,循环第一次时获取链表长度,循环第二次获取第k节点;
Low2:循环一次,将节点存入数组中。获得数组中倒数第k个节点。
上述实现都很容易,但解题太Low,就不实现代码了。
Better:设置一个“卡尺”:定义两个指针,第一个指针指向头结点,第二个指针指向第k个节点。两个指针同时往后移动,当第二个指针到达末尾的时候,第一个指针就是倒数第k个节点的位置。
Python代码
def FindKthToTail(self, head, k):
nodeK = head
while k:
try:
nodeK = nodeK.next
except (AttributeError):
return None
k -= 1
while nodeK:
nodeK = nodeK.next
head = head.next
return head
根据思路,以上是我实现的代码(捂脸),代码长度一般,而且还用到了try-except。。。惭愧惭愧。。。后来翻阅有没有更好的代码实现方式时,看到了一个很赞的Java代码,看完惊呼“漂亮”,代码位置在这里。领略到思想后实现的第一个版本如下:
def FindKthToTail(self, head, k):
if not head or k<=0:
return None
nodeOne = nodeK = head
i = 1
while nodeK.next:
if i >= k:
nodeOne = nodeOne.next
nodeK = nodeK.next
i += 1
return (nodeOne if i >= k else None)
写完之后发现,大牛的Java代码更精简。。。琢磨了一下,以下是改进版(捂脸):
def FindKthToTail(self, head, k):
nodeOne = nodeK = head
i = 1
while nodeK:
if i > k:
nodeOne = nodeOne.next
nodeK = nodeK.next
i += 1
return (nodeOne if i > k else None)