14. 链表中倒数第k个结点

题目:输入一个链表,输出改链表中倒数第k个结点。

思路:可以借助栈,先将链表从头到尾地压入栈,然后pop出k-1个结点,这时栈顶的元素就是倒数第k个结点了,但是,容易stackoverflow;

第二种复杂度为o(n)的思路:定义两个指针pAhead和pBehind,初始化都指向头结点,先让pAhead向后走k-1步,到达第k个结点,然后pAhead和pBehind再同时向后走,当pAhead到达尾结点时,pBehind正好指向倒数第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 == NULL || k < 1)
            return NULL;
        ListNode* pAhead = pListHead;
        ListNode* pBehind = pListHead;
        for(int i = 0; i < k - 1; ++ i){
            if(pAhead->next != NULL)
                pAhead = pAhead->next;
            else
                return NULL;
        }
        while(pAhead->next != NULL){
            pAhead = pAhead->next;
            pBehind = pBehind->next;
        }
        return pBehind;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_39605679/article/details/80892922