20200306-leetcode-offer-面試題22 鏈表第k個結點

在這裏插入圖片描述
分析:第一次直接蠻力寫的,看看分析後知道可以通過快慢指針來寫,兩個指針的間距爲k,當快指針到結尾時,慢指針即在開始的位置

先前的寫法:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* getKthFromEnd(ListNode* head, int k) {
        ListNode* cur=head;
        int cnt=0;                  //記錄鏈表總長cnt
        while(cur)
        {
            cnt++;
            cur=cur->next;
        }
        int begin=cnt-k;            //待打印起始位置begin
        while(begin--)
        {
            head=head->next;        //head指針指向該結點
        }
        return head;
    }
};

快慢指針:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* getKthFromEnd(ListNode* head, int k) {
        ListNode *frontNode=head,*backNode=head;
        while(backNode!=NULL&&k>0)
        {
            k--;
            backNode=backNode->next;
        }
        while(backNode!=NULL)
        {
            backNode=backNode->next;
            frontNode=frontNode->next;
        }
        return frontNode;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章