链表中倒数第k个节点
题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,我们从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6.这个链表的倒数第3个节点是值为4的节点。
思路:可以定义两个指针。第一个指针从链表的头指针开始遍历向后走k-1步,第二个指针保持不动;从第k步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当第一个指针到达链表的尾节点时,第二个指针正好指向倒数第k个节点。
注意:
(1)输入的链表头指针为空;
(2)输入的链表节点总数小于k;
(3)输入的参数k为0.
参考代码:
package jianzhioffer;
import java.util.Scanner;
/**
* 剑指Offer:链表中倒数第k个节点
*/
public class FinkKthToTail {
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
//创建链表
public ListNode CreateList(int[] array) {
ListNode head = new ListNode(array[0]);
head.next = null;
ListNode pAhead = head;
for (int i = 1; i < array.length; i++) {
ListNode q = new ListNode(array[i]);
q.next = null;
pAhead.next = q;
pAhead = q;
}
return head;
}
//打印链表中的元素
public void Print(ListNode head) {
ListNode pAhead = head;
while (pAhead != null) {
System.out.print(pAhead.val + " ");
pAhead = pAhead.next;
}
System.out.println();
}
//寻找链表中的倒数第K个数
public ListNode findKthToTail(ListNode head, int k) {
if (head==null|| k == 0)
return null;
ListNode pAhead = head;
ListNode pBehind = null;
for (int i = 0; i < k-1; i++) {
if (pAhead.next!=null){
pAhead = pAhead.next;
}else {
return null;
}
}
pBehind = head;
while (pAhead.next!=null){
pAhead = pAhead.next;
pBehind = pBehind.next;
}
return pBehind;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String[] str = scanner.nextLine().split(",");
int[] num = new int[str.length];
for (int i = 0; i < str.length; i++) {
num[i] = Integer.parseInt(str[i]);
}
int k = Integer.parseInt(scanner.nextLine());
FinkKthToTail sk = new FinkKthToTail();
ListNode head = sk.CreateList(num);
sk.Print(head);
ListNode result = sk.findKthToTail(head, k);
if (result==null){
System.out.println("Null");
}else {
System.out.println(result.val);
}
}
scanner.close();
}
}