输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
if not head:
return head
p = head
counter = 1
while p.next:
counter += 1
p = p.next
if counter < k:
return False
end_pos = counter - k # 此处让end_pos表示返回结点的前驱结点
counter = 1
p = head
while counter <= end_pos:
# 此处<=可以使退出循环时表示需要返回的结点,
# 若此处为<,出循环时p表示的是需要返回的结点的前驱结点,最后需要return p.next, 但是此时
# 会对[1], k=1这样的输入产生边界异常,此时p.next = None
p = p.next
counter += 1
return p
if __name__ == '__main__':
solution = Solution()
a = [1, 2, 3, 4, 5]
k = 2
head = ListNode(None)
p = head
for item in a:
p.next = ListNode(item)
p = p.next
head = head.next
# print(head.val, head.next.val)
result = solution.getKthFromEnd(head, k)
print(result.val, result.next.val)
a = [1]
k = 1
head = ListNode(None)
p = head
for item in a:
p.next = ListNode(item)
p = p.next
head = head.next
# print(head.val, head.next.val)
result = solution.getKthFromEnd(head, k)
print(result.val)
"""
运行结果:
4 5
1
Process finished with exit code 0
"""
[题目来源于leetcode剑指offer]