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