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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章