粽子丫丫

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目描述

输入一个链表,输出该链表中倒数第k个结点。
 
  首先想到的肯定是先走到链表末尾,然后再回溯到k节点。但是注意本题是单链表,单链表的节点只有从前往后的指针,而没有从后往前的,因此要想别的思路。
 
  这样的话就需要别的思路。假设链表有n个节点,那么倒数第k个节点就是从头到尾的第n-k+1个节点,这样的话就从头到尾遍历链表,每经过一个节点,计数器加1即可得到链表节点数。当然要想一次遍历即可找到倒数
 
第k个节点,需要定义两个指针。第一个从链表头节点开始往前走k-1步,此时第二个指针保持不动;从第k步开始第二个指针和第一个同时开始遍历,只是第二个是从头节点,第一个是从第k个节点开始,两个指针之间保持的
 
距离为k-1,当第一个节点到达链表尾节点时,第二个链表正好到达倒数第k个节点。
 
当然一下问题会使程序崩溃:  
  
  1、输入的链表head为null
  
  2、以head为头结点的链表总数小于k
  
  3、k=0
 
 
因此要注意代码的鲁棒性
 
程序如下:
 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         if(head == null||k <= 0) return null;
13         ListNode node = head;
14         int count = 0;
15         while(node != null){
16             count++;
17             node = node.next;
18             }
19         if(count<k) return null;
20         ListNode p = head;
21         for(int i = 0;i<count - k;i++){
22             p = p.next;
23         }
24         return p;  //
25     }
26 }

 

 
 
posted on 2017-04-10 21:05  粽子丫丫  阅读(193)  评论(0编辑  收藏  举报