题目描述:
输入一个链表,输出该链表中倒数第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

这篇博客介绍了如何在链表中找到倒数第k个节点的三种方法。第一种方法使用字典记录节点位置,但效率不高;第二种是先遍历链表获取长度,再从头开始找第k个节点;第三种方法使用两个指针,一个先走k步,然后两者同步移动直到前者到达末尾,此时后者即为倒数第k个节点。示例展示了针对链表1->2->3->4->5,k=2时,返回链表4->5的操作。
1112

被折叠的 条评论
为什么被折叠?



