题目描述
输入一个链表,输出该链表中倒数第k个结点。
public class Test { class ListNode { int value; ListNode next; public ListNode(int value) { this.value = value; } } public static void main(String[] args) { Test t = new Test(); ListNode node1 = t.new ListNode(1); ListNode node2 = t.new ListNode(2); ListNode node3 = t.new ListNode(3); ListNode node4 = t.new ListNode(4); ListNode node5 = t.new ListNode(5); ListNode node6 = t.new ListNode(6); ListNode node7 = t.new ListNode(7); node1.next = node2; node2.next = node3; node3.next = node4; node4.next = node5; node5.next = node6; node6.next = node7; node7.next = null; ListNode kThNode = t.findKthToTail(node1, 2); System.out.println(kThNode.value); } /** * 一次遍历找到倒数第k个节点 * @param head * @param k k从1开始 * @return */ public ListNode findKthToTail(ListNode head, int k) { // 输入的链表不能为空, k要大于0: k从1开始,小于0没有意义 if(head == null || k <= 0) return null; ListNode pForward = head; ListNode pBehind = null; // 第一个指针先向前走k-1. for(int i=0; i<k-1; i++) { // 如果k大于节点数,next可能指向空 ,返回空 if(pForward.next == null) return null; pForward = pForward.next; } // 第二个指针暂时不动 pBehind = head; // 两个指针一起移动 // 当前面一个指针遍历到最后一个节点,此时后面一个指针刚好指向倒数第k个节点 while(pForward.next != null) { pForward = pForward.next; pBehind = pBehind.next; } return pBehind; } }