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;
}
}
———-以上两种方法希望各位大神提一下宝贵意见,有更好的方法可以留言哦