美文网首页《剑指offer》Python版
22链表中倒数第k个结点

22链表中倒数第k个结点

作者: gantrol | 来源:发表于2019-01-17 14:15 被阅读0次

    输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。

    class ListNode(object):
        def __init__(self, val, nxt=None):
            self.value = val
            self.next = nxt
    
    
    def find_kth_to_tail(head, k):
        """
        @author: 黄健楸
        @aim:    输入一个链表,输出该链表中倒数第k个结点。
        @param:  head 头节点
        @param:  k    倒数第k个
        两个指针,一个指针先走k-1步,走到第K个节点,后两个节点一起走,
        当先走的指针走到链表尾部时,后走的指针便倒数第k个结点
        """
        if head is None or k == 0:
            return None
        probe_prev = head
        for _ in range(k - 1):
            if probe_prev.next:
                probe_prev = probe_prev.next
            else:
                return None
        probe_back = head
        while probe_prev.next:
            probe_prev = probe_prev.next
            probe_back = probe_back.next
        return probe_back
    
    
    if __name__ == "__main__":
        d = ListNode('d')
        c = ListNode('c', d)
        b = ListNode('b', c)
        a = ListNode('a', b)
        # print(find_kth_to_tail(a, 2))
        assert find_kth_to_tail(a, 4) is a
        assert find_kth_to_tail(a, 2) is c
        assert find_kth_to_tail(a, 1) is d
        assert find_kth_to_tail(a, 5) is None
        # void = ListNode(None)
        assert find_kth_to_tail(None, 2) is None
        assert find_kth_to_tail(a, 0) is None

    相关文章

      网友评论

        本文标题:22链表中倒数第k个结点

        本文链接:https://www.haomeiwen.com/subject/izlidqtx.html