题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路1:
1. 看到是单链表肯定不能反方向循环,倒数第k个节点,比如链表长度为6,倒数第三个也就是相当于正数第四个,符合6-3+1=4。
2. 所以就想到了正向遍历链表两次,但两次复杂度又太高,再考虑能不能遍历一次,进而想到了快慢指针。
3. 先判断头结点是否存在和k的大小,然后让快指针先走到第四个,也就是k的位置,然后慢指针从头节点开始走,等快指针走到最后,慢指针走道的位置就是结果,返回这个结果就可以了。
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
# write code here
if not head or k < 1:
return None
quick = head
slow = head
for i in range(k):
if quick == None:
return
quick = quick.next
while quick:
quick = quick.next
slow = slow.next
return slow
思路2:
自然而然想到使用容器(列表、堆栈、数组等)保存链表,然后直接查询
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
# write code here
if not head or k<1:
return None
# 使用列表保存链表结构
stack = []
cur = head
while cur:
stack.append(cur)
cur = cur.next
# 非法情况,即K大于链表长度
if k > len(stack):
return None
return stack[-k]