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

来源:互联网 发布:ubuntu wayland 编辑:程序博客网 时间:2024/05/26 16:00

输入一个链表,输出该链表中倒数第K个结点。从1开始计数,即该链表的尾节点是倒数第一个结点。

思路:

一、链表是单向链表,只能从头结点往后依次遍历,倒数第K个结点,也就是从头结点开始的n-(k-1)个结点。但是需要先遍历一遍得到链表长度,然后在找第n-k+1K结点。

二、

(1)方法一需要对链表进行二次遍历,如果我们使用两个指针,让走快的指针走到最后一个结点的时候走的慢的指针刚好走到倒数第K个。

(2)也就是说快指针比慢指针要早走k-1步。程序设计时先让快指针走k-1步,然后两个一起走,直到快指针的下一个为空则停止。此时快指针在尾节点的位置,慢指针在倒数第k个位置。

问题:

需要考虑的(1)当输入的头节点为空时;

          (2K <=0

          (3)看k大于链表的长度

                都返回空

代码:

/*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 faster = head;   ListNode slower = null;   for (int i = 0; i < k - 1; i++) //让快指针先走k-1步  {if(faster.next != null){  faster = faster.next;}elsereturn null; //若k大于链表的长度 返回null  }   slower = head;   while(faster.next != null) //让快指针的下一个节点是否为空来做判断,为空时说明快指针已经走到尾节点了,此时慢指针在倒数第K个位置,并将慢指针返回   {  faster = faster.next;  slower = slower.next;   }   return slower;    }}


0 0