剑指offer第14题 牛客网在线编程链接 https://www.nowcoder.com/activity/oj
链表中倒数第K个结点
题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路1
要想找到倒数第k个结点,我们可以先求出链表的总长度,然后就可以找到倒数第k个结点在链表中的位置,之后再遍历一遍链表,直到遍历到要求结点的位置时终止遍历。注意:输入的链表可能为空;k可能大于链表的长度;k可能为0,这些情况我们都返回空。
Python2.7编写
# -*- coding:utf-8 -*-
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def FindKthToTail(self, head, k):
#如果链表为空或者要得到的是倒数第0个结点,则返回空
if not head or k == 0:
return
p = head #用于求链表长度
q = head #用于找到倒数第k个结点
cnt = 0 #记录数组长度
while p:
cnt += 1
p = p.next
#如果要得到的节点编号大于链表总长度,则返回空
if k > cnt:
return
#倒数第k个结点的在链表中的位置
target = cnt - k + 1
cnt_n = 0 #用于记录走过链表的长度
#当走到要求结点的前一个节点时,停止。此时q指向的结点即为要求的结点。
while target - 1 != cnt_n:
q = q.next
cnt_n += 1
return q
思路2
第一种思路需要遍历链表2次,耗时较多。第二种思路可以只遍历一遍链表找出倒数第k个结点。
设置两个指针p,q分别指向头结点,第一个指针p向前走k-1步,此时指针p指向正数第k个结点,在这个过程中保持第二个指针不动。接下来让指针p和q同时移动,每次移一步,这样当指针p指向尾结点的时候,指针q指向倒数第k个结点。同样需要注意:输入的链表可能为空;k可能大于链表的长度;k可能为0,这些情况我们都返回空。
# -*- coding:utf-8 -*-
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def FindKthToTail(self, head, k):
#确保鲁棒性:链表为空以及k为0时的情况
if not head or k == 0:
return None
p = head
q = head
#当for循环终止的时候,指针p指向正数第k个结点
#此时如果k的值大于链表的长度,则p.next为None,则直接返回None
for i in range(k - 1):
if p.next != None:
p = p.next
else:
return None
#指针p和指针q同时移动,当指针p到达尾结点的时候,指针q指向倒数第k个结点
while p.next != None:
p = p.next
q = q.next
return q
写在后面
第二种思路参考:https://blog.csdn.net/sqiu_11/article/details/77657840