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

来源:互联网 发布:网络有利还是有害 编辑:程序博客网 时间:2024/05/19 18:16
题目描述:
  输入一个链表,输出该链表中倒数第k个结点。(hint: 请务必使用链表。)

解题思路:

  首先我们考虑到,用普通的思想,获取链表的长度,然后输出第length-k个元素的值,就是倒数第k个元素的值了。但是考虑到面试的技巧,这种方法还是不行的,但是做题时可以AC的。但是考虑的复杂点,如果时间复杂度为O(n)呢,一次扫描是不可能获取长度,又输出的。因此采取判断链表循环的思路,采用两个指针,第一个指针提前k-1步向下走,第二个指针再随着第一个指针一直走。知道第一个指针指向末尾,第二个指针的元素的值,便是我们所要求得的值。


具体Java实现代码如下:

import java.util.Scanner;public class SolutionKth {public class ListNode {    int val;    ListNode next = null;    ListNode(int val) {        this.val = val;    }}//创建链表public ListNode CreateList(int[] array){ListNode head=new ListNode(array[0]);head.next=null;ListNode p=head;for(int i=1;i<array.length;i++){ListNode q=new ListNode(array[i]);q.next=null;p.next=q;p=q;}return head;}//打印链表中的元素public void Print(ListNode head){ListNode p=head;while(p!=null){System.out.print(p.val+" ");p=p.next;}}//寻找链表中的倒数第K个数public ListNode FindKthToTail(ListNode head,int k) {if(k<=0)return null;if(head==null)return null;ListNode p=head;ListNode q=head;int i=1;while(p.next!=null){if(i<k){p=p.next;i++;}else{p=p.next;q=q.next;}}if(i<k)return null;return q;    }public static void main(String[] args){Scanner sc=new Scanner(System.in);    String input=sc.nextLine();    String[] inputlist=input.split(" ");    int[] array=new int[inputlist.length];    for(int i=0;i<inputlist.length;i++)    {    array[i]=Integer.parseInt(inputlist[i]);    }    SolutionKth sk=new SolutionKth();    ListNode head=sk.CreateList(array);    sk.Print(head);    ListNode result=sk.FindKthToTail(head, 2); //此处程序中将k设置为2了,可根据需要修改    System.out.print(result.val);}}

输入:1 2 3 5 7 10

输出:7

0 0
原创粉丝点击