第2章 面试需要的基础知识
第3章 高质量的代码
面试题16:数值的整数次方
面试题21:调整数组顺序使奇数位于偶数前面
面试题22:链表中倒数第k个结点
第4章 解决面试题的思路
第5章 优化时间和空间效率
第6章 面试中的各项能力
第7章 两个面试案例
题目描述
牛客网
输入一个链表,输出该链表中倒数第k个结点。
解题思路
假设链表总长 n>=k,定位到倒数第k个节点,需要从头遍历n-k+1个节点,而n事先不知道,因此难点在于如何得出n-k+1的值。
解法一:
很直观的想法就是遍历一遍链表,得到链表总节点数n,然后计算得到n-k+1,返回从头开始的第n-k+1个节点。
实战
class Solution:
def FindKthToTail(self, head, k):
# write code here
if not head or k <= 0:
return None
counts = 0
p = head
while p:
counts += 1
p = p.next
if counts < k:
return None
counts -= k
p = head
while counts:
p = p.next
counts -= 1
return p
解法二:
使用前后指针可以得到比上面更快的解法,不过也是O(n)的时间复杂度。
先用快指针走k-1步,然后快慢指针一起走,直到快指针走到链表尾。此法巧妙的地方在于快指针走了k-1步后,剩下还有n-k+1步未走,这时慢指针从头开始和快指针一起走,快指针走到尾部时,慢指针刚好走了n-k+1步,此时慢指针正好在倒数第k个节点上。
实战
class Solution:
def FindKthToTail(self, head, k):
# write code here
if not head or k <= 0:
return None
fast, slow = head, head
for i in range(k-1):
fast = fast.next
if not fast:
return None
while fast.next:
fast = fast.next
slow = slow.next
return slow
另一种写法
class Solution:
def FindKthToTail(self, head, k):
# write code here
if not head or k <= 0:
return None
p = head
while p.next:
p = p.next
if k == 1:
head = head.next
else:
k -= 1
if k == 1:
return head
return None