码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-02-15 10:29:02      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:复杂度   遍历   list   terminal   倒数   sof   code   targe   target   

  题目描述:输入一个链表,输出该链表中倒数第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个结点

标签:复杂度   遍历   list   terminal   倒数   sof   code   targe   target   

原文地址:https://www.cnblogs.com/WJQ2017/p/8449256.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!