剑指Offer——链表中倒数第K个节点
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; } }