剑指Offer-14.链表中倒数第k个结点(C++/Java)

Posted silentteller

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer-14.链表中倒数第k个结点(C++/Java)相关的知识,希望对你有一定的参考价值。

题目:

输入一个链表,输出该链表中倒数第k个结点。

分析:

第一个解法,我们可以先遍历一遍链表,计算下节点的总数n,然后再从头结点查n-k个节点,即是倒数第k个节点。

第二个解法,便是使用双指针,两个指针都先指向头节点,第一个指针先前进k-1个节点,然后两指针一起前进,当第一个指针到达尾节点时,第二个指针指的节点便是我们要求的。

此外要注意当k为0时要返回null,而且如果k大于链表中的节点个数,也要返回null。

程序:

C++

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

Java

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if(head == null || k == 0)
            return null;
        ListNode pFirst = head;
        ListNode pSecond = head;
        
        for(int i = 0; i < k-1; ++i){
            if(pFirst.next != null)
                pFirst = pFirst.next;
            else
                return null;
        }
        while(pFirst.next != null){
            pFirst = pFirst.next;
            pSecond = pSecond.next;
        }
        return pSecond;
    }
}

以上是关于剑指Offer-14.链表中倒数第k个结点(C++/Java)的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer14链表中倒数第k个结点

剑指Offer 14. 链表中倒数第k个结点 (链表)

剑指Offer-14.链表中倒数第k个结点(C++/Java)

剑指offer---14---链表中倒数第k个结点

剑指offer(C++)-JZ22:链表中倒数最后k个结点(数据结构-链表)

剑指Offer 链表中倒数第k个结点