您的位置:首页 > Web前端

java实现剑指Offer第15题“链表中倒数第 k 个结点”

2017-04-28 16:21 330 查看
参考博文链接:http://www.cnblogs.com/edisonchou/p/4769164.html

package com.puhua.list;

public class PrintReciprocalLinkedListNumber {
/**
* 题目:输入一个链表,输出该链表中倒数第 k 个结点。
* 为了符合大多数人的习惯,本题从 1 开始计数,即链表的尾结点是倒数第一个结点。
* 例如一个有 6 个结点的链表,从头结点依次是 1,2,3,4, 5,6。倒数第三个结点就是值为 4 的结点。
*/
/**
* 解题思路:为了能够只遍历一次就能找到倒数第k个节点,可以定义两个指针:
* (1)第一个指针从链表的头指针开始遍历向前走k-1,第二个指针保持不动;
* (2)从第k步开始,第二个指针也开始从链表的头指针开始遍历;
* (3)由于两个指针的距离保持在k-1,当第一个(走在前面的)指针到达链表的尾结点时,
*     第二个指针(走在后面的)指针正好是倒数第k个结点。
*/
public static void main(String[] args) {
//实例化6个链表结点
ListNode head=new ListNode();
ListNode second=new ListNode();
ListNode third=new ListNode();
ListNode forth=new ListNode();
ListNode fifth=new ListNode();
ListNode sixth=new ListNode();
//将六个结点前后串起来
head.next=second;
second.next=third;
third.next=forth;
forth.next=fifth;
fifth.next=sixth;
//六个结点分别赋值
head.data=1;
second.data=2;
third.data=3;
forth.data=4;
fifth.data=5;
sixth.data=6;
//实例化当前类,实例p
PrintReciprocalLinkedListNumber p=new PrintReciprocalLinkedListNumber();
ListNode resultListNode=p.findKToTail(head, 3);
System.out.println(resultListNode.data);
}

public ListNode findKToTail(ListNode head, int k){
if(head==null||k==0){
return null;
}
ListNode ahead=head;
ListNode behind=head;
//先让ahead遍历到顺数k-1的位置
for(int i=0;i<k-1;i++){
if(ahead.next!=null){
ahead=ahead.next;
}else{
return null;
}
}
//ahead和behind同时开始遍历,直到ahead走到了链表的尽头,也就意味着behind到了倒数第k位
while(ahead.next!=null){
ahead=ahead.next;
behind=behind.next;
}
return behind;
}


}

package com.puhua.list;

public class ListNode {
int data;
ListNode next;


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 单向链表
相关文章推荐