题目描述:
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
示例1:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
思路1:
使用一个dict记录每个节点是第几个然后返回即可,但是时间复杂度较高。
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
d = dict()
count = 1
if not head:
return head
cur = head
while cur:
d[count] = cur
cur = cur.next
count += 1
if k <= count:
return d[count-k]
else:
return head
思路2:单指针
先遍历统计链表长度,记为 n ;
设置一个指针走 (n-k)步,即可找到链表倒数第 k个节点。
思路3:
# 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
"""
former, later = head, head
for _ in range(k):
former = former.next
while former:
former = former.next
later = later.next
return later