22:链表中倒数第k个节点(剑指offer第2版Python)

1、题目描述

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

注意代码鲁棒性,三种特殊情况要考虑到

如果在只希望一次遍历的情况下, 寻找倒数第k个结点, 可以设置两个指针
第一个指针先往前走k-1步, 然后从第k步开始第二个指针指向头结点
然后两个指针一起遍历
当地一个指针指向尾节点的时候, 第二个指针正好指向倒数第k个结点

推广: 寻找中间节点, 两个指针一起, 第一个指针每次走两步, 第二个指针每次走一步,  快指针指到尾部, 慢指针正好指到中间

2、代码详解

# -*- coding:utf-8 -*-
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None


class Solution:
    def FindKthToTail(self, head, k):
        # 防止头指针为空,或k无意义
        if head == None or k <= 0:
            return None
        # 快慢指针:实现仅一次遍历链表
        pAhead = head
        pBehind = head
        # 先让快指针前进k-1步
        for i in range(k-1):
            # 防止节点数少于k,造成访问空指针
            if pAhead.next != None:
                pAhead = pAhead.next
            else:
                return None  # 节点数少于k

        while pAhead.next != None:
            pAhead = pAhead.next
            pBehind = pBehind.next
        return pBehind


node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(4)
node1.next = node2
node2.next = node3
node3.next = node4

S = Solution()
print(S.FindKthToTail(node1, 5).val)
发布了184 篇原创文章 · 获赞 225 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/IOT_victor/article/details/104488173