面试题 15:链表中倒数第 k 个结点
题目:输入一个链表,输出该链表中倒数第 k 个结点。为了符合大多数人的习惯,本题从 1 开始计数,即链表的尾结点是倒数第一个结点。例如一个有 6 个结点的链表,从头结点依次是 1,2,3,4,5,6。倒数第三个结点就是值为 4 的结点。
思路
这道题和上一道题考点一样,都是基于单向链表的单向性。
思路是先创建一个结点temp指向头结点,将其向后移动k-1个位置(如果可以),之后创建一个新的结点result指向头结点,之后temp和result同时向后移动,直到temp到达尾结点。则result所在的位置就是链表中倒数第k个结点。这个方法简单明了,而其余的方法例如用栈大都会导致多余的时间和空间开销。
代码
package swordOffer;
/**
* 面试题 15:链表中倒数第 k 个结点
* 题目:输入一个链表,输出该链表中倒数第 k 个结点。为了符合大多数人的习惯,本题从
* 1开始计数,即链表的尾结点是倒数第一个结点。例如一个有 6 个结点的链表,从头结点
* 依次是 1,2,3,4, 5,6。倒数第三个结点就是值为 4 的结点。
*
* @author Stephen Huge
*
*/
public class Ex15CountBackwardsInLinkList {
public static void main(String[] args) {
Ex15CountBackwardsInLinkList cbwill = new Ex15CountBackwardsInLinkList();
ListNode a = new ListNode(1);
ListNode b = new ListNode(2);
ListNode c = new ListNode(3);
ListNode d = new ListNode(4);
a.next = b;
b.next = c;
c.next = d;
ListNode sol = cbwill.countBackwardsInLinkList(a, 2);
// System.out.println(sol.getClass().getSimpleName()); //对象名无法打印
}
public ListNode countBackwardsInLinkList(ListNode node, int k) {
if(node == null || k == 0) {
return null;
}
ListNode temp = null;
ListNode result = null;
temp = node;
for(int i = 0; i < k; i++) {
if(temp.next != null) {
temp = temp.next;
}else{
return null;
}
}
result = node;
while(temp.next != null) {
temp = temp.next;
result = result.next;
}
return result;
}
// public class ListNode{
// int data;
// ListNode next;
//
// public ListNode(int data) {
// this.data = data;
// }
// }
}