链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点。
解题思路
暴力求解:
- 判断链表是否为空;
- 复制链表,遍历一遍统计其长度;
- 如果长度小于k。则返回None;
- 否则,返回其长度-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:
return None
head_copy=head
cnt=1
while head.next:
head=head.next
cnt+=1
if cnt<k:
return None
for i in range(cnt-k):
head_copy=head_copy.next
return head_copy
进阶版,快慢指针,第一个指针先走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:
return None
if k==0:
return None
head_copy=head
cnt=1
while head.next:
head=head.next
if cnt>=k:
head_copy=head_copy.next
cnt+=1
if cnt<k:
return None
return head_copy