1、题目描述
输入一个链表,输出该链表中倒数第k个结点。
2、代码实现
package com.baozi.offer;
/**
* @author BaoZi
* @create 2019-07-11-15:38
*/
public class Offer11 {
public static void main(String[] args) {
Offer11 offer11 = new Offer11();
ListNode l1 = new ListNode(1);
ListNode l2 = new ListNode(2);
ListNode l3 = new ListNode(3);
ListNode l4 = new ListNode(4);
ListNode l5 = new ListNode(5);
ListNode l6 = new ListNode(6);
l1.next = l2;
l2.next = l3;
l3.next = l4;
l4.next = l5;
l5.next = l6;
l6.next = null;
ListNode reslut = offer11.FindKthToTail(l1, 4);
ListNode temp = reslut;
while (temp != null) {
System.out.println(temp.val);
temp = temp.next;
}
}
/*为了实现只遍历一次就能找到倒数第k个节点,我们可以定义两个指针:
第一个指针从链表的头指针开始遍历向前走k-1步直到第k个节点位置,此时第二个指针保持不动;
从第k个节点开始,第二个指针也开始从链表的头指针开始遍历;
由于两个指针相距k-1个节点,当走在前面的指针到达链表的尾部时候,
走在后面的指针所知的位置正好就是倒数第k个节点
*/
public ListNode FindKthToTail(ListNode head, int k) {
//1、先进行特殊情况的判断
if (head == null || k < 0) {
return null;
}
ListNode temp1 = head;
ListNode temp2 = head;
//2、先让第一个指针向前移动k-1个位置
for (int i = 0; i < k; i++) {
temp1 = temp1.next;
}
//3、此时两个指针同时向前移动,当第一个指针移动到最末尾的时候,此时的第二个指针指向的就是倒数第K个位置
while (temp1 != null) {
temp1 = temp1.next;
temp2 = temp2.next;
}
return temp2;
}
}
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}