剑指 Offer 22:链表中倒数第k个节点

剑指 Offer 22:链表中倒数第k个节点

题目

题目链接
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

示例:

给定一个链表: 1->2->3->4->5, 和 k = 2.

返回链表 4->5.

解题

leetcode-19:删除链表的倒数第N个节点这道题类似,但是比这道题更加简单

方法一:顺序查找

先遍历出链表长度l,再遍历l-k个

class Solution {
    
    
public:
    ListNode* getKthFromEnd(ListNode* head, int k) {
    
    
        int l=0;
        ListNode* cur=head;
        while(cur){
    
    
            l++;
            cur=cur->next;
        }
        cur=head;
        for(int i=0;i<l-k;i++){
    
    
            cur=cur->next;
        }
        return cur;
    }
};

方法二:双指针

这道题不需要定义哑节点,因为不涉及删除节点 。
先让快指针走k步,然后快慢指针一起走,直到快指针为nullptr为止。

class Solution {
    
    
public:
    ListNode* getKthFromEnd(ListNode* head, int k) {
    
    
        ListNode* slow=head;
        ListNode* fast=head;
        while(k--){
    
    
            fast=fast->next;
        }
        while(fast){
    
    
            slow=slow->next;
            fast=fast->next;
        }
        return slow;
    }
};

Guess you like

Origin blog.csdn.net/qq_21539375/article/details/121539533