题目描述:
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
-
遍历法:先完整的遍历一遍列表,如果链表的长度大于 k k k,在返回链表第 l − k + 1 l-k+1 l−k+1个节点也就是倒数第 k k k个节点,但这样的方法需要遍历两次链表
class Solution: def FindKthToTail(self, head, k): if head == None or k <= 0: return None p = head # 链表元素数 l = 1 while p.next: l += 1 p = p.next if l < k: return None # 找倒数第k个结点 q = head tar = l - k + 1 while tar-1 > 0: q = q.next tar -= 1 return q -
指针法:设置两个指针 p p p和 q q q,首先 q q q保持不动,p往前走 k − 1 k-1 k−1步;然后 p p p和 q q q同时往后,当 p p p到达尾节点时, p p p所在的位置刚好就是倒数第 k k k个节点,因为 p p p和 q q q之间的距离就是k
class Solution: def FindKthToTail(self, head, k): if head == None or k <= 0: return None p = head # p先走k-1步 for i in range(k-1): if p.next: p = p.next else: return None q = head while p.next: p = p.next q = q.next return q