단일 체인 시트 의 마지막 k 번 째 노드 를 가 져 오 는 세 가지 방법

질문 설명:
링크 를 입력 하여 이 링크 의 마지막 k 번 째 노드 를 출력 합 니 다.
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}

방안 1: 폭력 방법:
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;

    }
};

프로젝트 2: 빠 른 속도 포인터:
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;
    }
};

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

좋은 웹페이지 즐겨찾기