链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点。
思路
- 解法一
列表。
利用辅助空间stack,遍历链表,将链表中的所有结点添加到辅助空间中,利用列表的索引操作返回倒数第k个结点。 - 解法二
指针。
创建慢指针和快指针。利用等间隔法可以得到链表中倒数第k个节点。注意异常处理。如果k大于链表长度,那么fast先走时就会越界。
- 算法比较
解法一额外空间复杂度为O(n),时间复杂度为O(n)。解法二时间复杂度为O(n),不需要额外空间。
代码
- 解法一
# -*- coding:utf-8 -*-
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def FindKthToTail(self, head, k):
if head is None or k == 0:
return
stack = []
while head is not None:
stack.append(head)
head = head.next
return stack[-k] if k <= len(stack) else None
- 解法二
# -*- 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 not k:
return
count = 1
fast = head
while fast.next is not None:
if count == k:
break
fast = fast.next
count += 1
if count != k:
return
else:
slow = head
while fast.next is not None:
slow = slow.next
fast = fast.next
return slow