写点什么

输入一个链表,输出该链表中倒数第 k 个结点。

作者:InfoQ IT百科
  • 2022 年 4 月 24 日
  • 本文字数:1147 字

    阅读完需:约 4 分钟

如何解答输入一个链表,输出该链表中倒数第 k 个结点这个问题,可以采用以下方法:


如何解答输入一个链表,输出该链表中倒数第 k 个结点这个问题,可以采用以下方法:

1. 两次遍历: 一次求节点个数 n,一次走 n-k+1 步

单链表是单向,所以只能顺着数,但是如果要找到倒数第 k 个节点,其实就是顺着数第 n - k + 1 个节点。

时间复杂度: $O(2n)$

空间复杂度:$O(1)$

class Solution:    def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:        cur,count = head, 0  # 这里一定要保存head的位置        while head:            count += 1            head = head.next  # 第一次遍历结束后,head为空                for _ in range(count - k):            cur = cur.next    # 使用cur来重新遍历        return cur
复制代码


2. 双指针

  • 第一个指针移动 k 步,第二个指针再从头开始,这个时候两个指针同时移动

  • 当第一个指针到达链表的末尾的时候,返回第二个指针

时间复杂度: $O(n)$

class Solution:    def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
if head is None or k <= 0: return None first, second = head, head
# first一直走到k for _ in range(k): first = first.next # 当first不为空,first,second一起走 while first: first, second = first.next, second.next # first为空,second所在的位置刚好就是倒数第k个节点 return second
复制代码


3. 递归法

递归往下走,同时增加一个count来记录递的次数,并把结果记录在 res 中,当到达第 k 个节点时,直接返回head


class Solution:    def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
count = 0 def helper(head): # 边界条件 if head is None: return None nonlocal count res = helper(head.next) count += 1 if count == k: return head return res return helper(head)
复制代码


其实也不需要增加 count,直接利用 k,每一次递的过程中,对 k 进行减一,当 k==0 ,说明到达第 k 个节点,返回 head ,不然将继续进行下去,直到 head 为空。

class Solution:    def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
def helper(head): if head is None: return None nonlocal k res = helper(head.next) k -= 1 if k == 0: return head return res return helper(head)
复制代码


用户头像

还未添加个人签名 2021.04.12 加入

还未添加个人简介

评论

发布
暂无评论
输入一个链表,输出该链表中倒数第k个结点。_InfoQ IT百科_InfoQ写作社区