获取单链表的倒数第k个节点的三种办法

问题描述:

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

struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}

方案一:暴力方法:

class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if (!pListHead || k <= 0) return nullptr;
        int n = 0;
        ListNode *cur = pListHead;
        while (cur) {
            cur = cur->next;
            ++n;
        }
        if (n < k) return nullptr;
        n -= k;
        while (n--) {
            pListHead = pListHead->next;
        }
        return pListHead;

    }
};

方案二:快慢指针:

class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if (!pListHead || k <= 0) return nullptr;
        auto slow = pListHead, fast = pListHead;

        //快慢指针差为k个节点
        while (k--) {
            if (fast)
                fast = fast->next;
            else 
                return nullptr; //如果单链表长度 < K,直接返回
        }
        while (fast) {
            slow = slow->next;
            fast = fast->next;
        }
        return slow;
    }
};

方案三,记录法

class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        ListNode* p = pListHead;
        int count = 0;
        vector<ListNode*> temp;
        while(p){
            count ++;
            temp.push_back(p);
            p = p->next;
        }
        
        if(count < k)
            return nullptr;
        return temp[count - k];
    }
};

 

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页