剑指offer14

剑指offer14:链表中倒数第K个结点

题目描述

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

解法一:基于递归的方法

class Solution {
public:
    unsigned int cnt = 0;
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if (pListHead == NULL)
            return NULL;
        ListNode* node = FindKthToTail(pListHead->next, k);
        if (node != NULL)
            return node;
        cnt++;
        if (cnt == k)
            return pListHead;
        else
            return NULL;
    }
};

解法二:基于正数第i-k个

class Solution2 {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if (pListHead == NULL || k == 0)
            return NULL;
        ListNode* flag = pListHead;
        ListNode* first = pListHead;
        unsigned int i = 1;
        while (flag->next != NULL)
        {
            flag = flag->next;
            i++;
        }
        unsigned int j = 1;
        if (i<k)
            return NULL;
        else
        {
            for (j = 1; j <= (i - k); j++)  //倒数第k个则是正数第i-k个,一共有i个
                first = first->next;
            return first;
        }
    }
};

解法三:基于快慢双指针

class Solution3 {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if (pListHead == NULL || k == 0)
            return NULL;
        ListNode*pTail = pListHead, *pHead = pListHead;
        for (int i = 1; i<k; ++i)
        {
            if (pHead->next != NULL)
                pHead = pHead->next;
            else
                return NULL;
        }
        while (pHead->next != NULL)
        {
            pHead = pHead->next;
            pTail = pTail->next;
        }
        return pTail;
    }
};

   转载规则


《剑指offer14》 赵小亮 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
剑指offer15 剑指offer15
剑指offer15:反转链表 题目描述题目描述 输入一个链表,反转链表后,输出新链表的表头。 解法一:基于头插法class Solution { public: ListNode* ReverseList(ListNode* pH
2020-05-13
下一篇 
剑指offer31 剑指offer31
剑指offer31:整数中1出现的次数(从1到n整数中1出现的次数) 题目描述题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? 为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因
2020-05-11
  目录