劍指offer——連結串列中倒數第k個結點

baixiaofei567發表於2020-12-24

在這裡插入圖片描述
法一:遍歷兩次,第一次數出有幾個結點,第二次遍歷到n-k時return。結果:回家等通知
法二:類似一把尺子,可以叫他前後指標(快慢指標不準確),先讓一個指標走k-1步,然後另一個指標指向頭結點0。當快指標走到尾結點時,慢指標剛好走到n-k的位置。因為快慢指標差的距離剛好是k-1。假設結點有n個,那麼最後一個結點的位置是n-1,減去k-1剛好是n-k。
在這裡插入圖片描述

但是還是拿不到offer,因為你完全沒有考慮魯棒性
在這裡插入圖片描述

還有三點必須進行判斷
1.頭結點是否為空結點,如果為空,那麼我們會試圖訪問空指標的記憶體
2.結點總數小於k,那麼在快指標走k-1步時會直接崩潰,所以在快指標走時要判斷下一個結點是否為空,不為空才等於next
3.k<=0,直接崩潰。
總之就是檢查輸入資料的合法性。

/*
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<= 0){
            return NULL;
        }
        ListNode* pre = pListHead;
        ListNode* last = pListHead;
        
        for(int i = 1; i < k; i++){
            if(pre->next != NULL){
                pre = pre->next;
            }
            else{
                return NULL;
            }
        }
        
        while(pre->next != NULL){
            pre = pre->next;
            last = last->next;
        }
        return last;
    }
};

相關文章