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

Posted wjq2017

tags:

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

  题目描述:输入一个链表,输出该链表中倒数第k个结点。

  题目链接:链表中倒数第k个结点

  思路:指向首结点的第1个指针走k-1步,如果后继结点为空,则返回null,第1个指针指向第k个结点。指向首结点的第2个指针与第1个指针同步遍历,当第1个指针指向最后一个结点时,第2个指针走了n-k步,指向了倒数第k个结点(n-1-(n-k)=k-1,倒数第1个结点与倒数第k个结点相差k-1步)。

  步骤:

  1 如果首结点为空或者k<=0,返回null。

  2 指向首结点的第1个指针走k-1步。

  3 指向首结点的第2个指针与第1个指针同步遍历,直到第1个指针指向最后一个结点。

  4 返回第2个指针指向的结点。

  时间复杂度:O(n)。

  Java代码:

 1 /*
 2 public class ListNode {
 3     int val;
 4     ListNode next = null;
 5 
 6     ListNode(int val) {
 7         this.val = val;
 8     }
 9 }*/
10 public class Solution {
11     public ListNode FindKthToTail(ListNode head,int k) {
12         // 如果首结点为空或者k<=0,返回null
13         if (head == null || k <= 0) {
14             return null;
15         }
16         
17         // 第1个指针指向首结点
18         ListNode first = head;
19         // 走k-1步,第1个指针指向第k个结点
20         for (int i = 1; i < k; i++) {
21             // 后继结点不能是null
22             if (first.next == null) {
23                 return null;
24             }
25             
26             first = first.next;
27         }
28         
29         // 第2个指针指向首结点
30         ListNode second = head;
31         // 当第1个指针指向最后一个结点时,第2个指针走了n-k步,指向了倒数第k个结点
32         // n-1-(n-k)=k-1
33         // 倒数第1个结点与倒数第k个结点相差k-1步
34         while (first.next != null) {
35             first = first.next;
36             second = second.next;
37         }
38         
39         return second;
40     }
41 }

  

  参考资料

  [编程题]链表中倒数第k个结点

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

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

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

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

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

《剑指Offer》题目:链表中倒数第k个结点

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