题目描述
输入一个链表,输出该链表中倒数第k个结点。
题目解法
遍历两次链表
- 第一次统计出链表中节点的个数;
- 第二次找到倒数第k个节点。
class Solution:
def FindKthToTail(self, head, k):
# write code here
if not head: return
count = 1
p = q = head
while p.next:
p = p.next
count += 1
# k的范围有限制
if k > count or k < 0: return
# 注意虽然是第count-k+1个节点,但是从1开始,实际上走count-k步
for i in range(1, count-k+1):
q = q.next
return q
遍历一次链表
定义两个指针:
- 第一个指针走k-1步,第二个指针不动;
- 从第k步开始,两个指针一起遍历,保持k-1的距离;
- 当第一个指针走到尾节点时,第二个指针指向倒数第k个节点。
具体例子如下:
链表[1,2,3,4,5,6,7],k=3
第一个指针从1开始走3-1=2步,指针指向3,第二个指针保持不动指向1;
两个指针一起遍历,始终保持k-1的距离;
第一个指针到达尾节点7的同时,第二个指针也指向倒数第3个节点5。
class Solution:
def FindKthToTail(self, head, k):
# write code here
if not head or k < 1: return
p = q = head
for i in range(k-1):
if p.next:
p = p.next
else:
return
while p.next:
p = p.next
q = q.next
return q
辅助空间
借助List将每个节点保存下来,pythonic的写法,但是要 O ( n ) O(n) O(n)的空间复杂度。
class Solution:
def FindKthToTail(self, head, k):
# write code here
res = []
while head:
res.append(head)
head = head.next
if k >= 1 and k <= len(res):
return res[-k]
else:
return