输入一个链表,输出该链表中倒数第k个结点。

来源:互联网 发布:nginx视频教程 编辑:程序博客网 时间:2024/05/21 17:44
package com.dixin.temp;import java.util.Stack;/** * Created by admin on 2017/10/25. * 输入一个链表,输出该链表中倒数第k个结点。 */public class G {    class ListNode {//内部类节点类        int val;        ListNode next = null;        ListNode(int val) {            this.val = val;        }    }    //@1 通常有倒字,我们都可以考虑一下用栈试试,先把链表反转,然后再找出第k个节点    public ListNode FindKthToTail(ListNode head,int k) {        Stack<ListNode> stack=new Stack<ListNode>();        int count=0;//记录链表的个数,有可能小于k,第一次编译不成功就是没考虑到这种请况        //循环将链表中的节点压入栈中        while (head!=null) {            stack.push(head);            head=head.next;            count++;        }        if(count<k) {            return null;        }        ListNode kNode=null;        for(int i=0;i<k;i++) {            kNode=stack.pop();//将栈弹出k次,第k次弹出的节点就是我们要的倒数第k个节点        }        return kNode;    }    //@2 用两个指针,先让第一个指针走k-1步,此时若第一个指针是最后一个节点,    //   那么第二个指针在的位置就是倒数第k个节点    public ListNode FindKthToTail2(ListNode head,int k) {        if(head==null||k<=0) {            return null;        }        ListNode point1=head;//第一个指针        ListNode point2=head;//第二个指针        for(int i=1;i<k;i++) {//第一个指针走k-1步            if(point1.next!=null) {                point1=point1.next;            } else {//k大于链表的长度,找不到倒数第k个点                return null;            }        }        //此时两个指针一起运动        while(point1.next!=null) {//直到第一个指针是最后一个节点            point1=point1.next;            point2=point2.next;        }        return point2;    }}

———-以上两种方法希望各位大神提一下宝贵意见,有更好的方法可以留言哦

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