剑指offer 22 - 链表中倒数第K个节点 - python

75 阅读1分钟

题目描述

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

示例:

给定一个链表: 1->2->3->4->5, 和 k = 2.

返回链表 4->5.

  • 遍历法:先完整的遍历一遍列表,如果链表的长度大于 k k k,在返回链表第 l − k + 1 l-k+1 l−k+1个节点也就是倒数第 k k k个节点,但这样的方法需要遍历两次链表

    class Solution:
        def FindKthToTail(self, head, k):
            if head == None or k <= 0:
                return None
            
            p = head
            # 链表元素数
            l = 1
            while p.next:
                l += 1
                p = p.next
    
            if l < k:
                return None
                
            # 找倒数第k个结点
            q = head
            tar = l - k + 1
            while tar-1 > 0:
                q = q.next
                tar -= 1
            
            return q
    
  • 指针法:设置两个指针 p p p和 q q q,首先 q q q保持不动,p往前走 k − 1 k-1 k−1步;然后 p p p和 q q q同时往后,当 p p p到达尾节点时, p p p所在的位置刚好就是倒数第 k k k个节点,因为 p p p和 q q q之间的距离就是k

    class Solution:
        def FindKthToTail(self, head, k):
            if head == None or k <= 0:
                return None
    
            p = head
    		# p先走k-1步
            for i in range(k-1):
                if p.next:
                    p = p.next
                else:
                    return None
                    
            q = head
            while p.next:
                p = p.next
                q = q.next
                
            return q