题目来源:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
之前听师兄提到过这一题,临时没回想起来当时怎么说的,重新想了一下。
题目表述有点问题,根据示例,返回的是从第k个节点开始的链表段,而不是第k个节点。
考虑设置两个指针p1和p2,让p1先走,经过k步之后开始走p2,这样p1和p2之间的间隔就是k-1(不包括p2此时的位置)。
比如示例中,p1走到3的位置上时,p2开始指向1的位置,中间间隔一个节点。
当先走的p1到达尾结点(None)时,p2刚好在倒数第k个节点。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def getKthFromEnd(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
p1 = head # 先走指针p1
while p1 != None and k != 0: # p1经过k步
p1 = p1.next
k -= 1
p2 = head # 设置p2
while p1 != None: # 开始走p2,此时p1和p2同时前进,当p1到达最后一个节点时,p2在其间隔k个节点的位置(即倒数k+1的位置),再一次循环,p1指向None,p2指向倒数第k个节点
p1 = p1.next
p2 = p2.next
return p2 # 题目要求返回类型为ListNode,所以直接返回剩下的链表段