【剑指offer】面试题15:链表中倒数第k个结点

来源:互联网 发布:淘宝客服外包公司注册 编辑:程序博客网 时间:2024/05/22 16:40

题目

  输入一个链表,输出该链表中倒数第k个结点。
  为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6,这个链表的倒数第3个结点是值为4的结点。

思路

思路1(不推荐)

  倒数第k个结点=从头结点开始的第n-k+1个结点。遍历两次,第一次计数(链表长度),第二次遍历查找倒数第k个结点。但是要遍历两边链表,并不是最优解法。

思路2:两个指针,一前一后。

  1.第一个指针从链表的头结点开始遍历向前走k-1,第二个指针保持不动;
  2.从第k步开始,两个指针同时向前移动。
  由于两个指针的距离始终保持在k-1,所以当第一个指针走到尾结点时,第二个指针刚好在倒数第k个结点。

代码实现

链表结点定义:

public class ListNode {    int val;    ListNode next = null;    ListNode(int val) {        this.val = val;    }}

思路2的代码实现如下:

/*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;        //两个指针,一前一后,间隔k-1        ListNode curr1 = head;        ListNode curr2 = head;        //curr1先往前移动k-1,如果链表长度小于k,return null        for(int i=0;i<k-1;i++){            if(curr1.next!=null){                curr1 = curr1.next;            }else{                return null;            }        }        //curr2走到最后一个结点时,curr1正好在倒数第k个结点        while(curr1.next!=null){            curr1 = curr1.next;            curr2 = curr2.next;        }        return curr2;    }}

鲁棒性:1.if(head==null||k<=0) return null;
    2.长度小于k时返回null。

注:运行环境:牛客网OJ。如果在编译器中需要自己加工一下,比如自己写几个测试用例。

阅读全文
0 0
原创粉丝点击