链表中倒数第k个结点
题目
输入一个链表,输出该链表中倒数第k个结点。
思路
思路1 - 栈
先将所有结点入栈,然后出栈,第k个出栈的即为所求结点。
思路2 - 循环数组
定义大小为k的循环数组,循环赋值,直到所有结点赋值完毕。
此时,循环数组中存储的值是倒数k个结点,最后一个结点的下一位对应的就是倒数第k个结点。
题解
题解1 - 栈
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
import java.util.Stack;
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(k==0)
return null;
ListNode temp = head;
Stack<ListNode> stack = new Stack<>();
while(temp!=null){
stack.push(temp);
temp = temp.next;
}
if(k>stack.size())
return null;
while(k-->0){
temp = stack.pop();
}
return temp;
}
}
题解2 - 循环数组
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(k==0)
return null;
ListNode temp = head;
ListNode[] nodes = new ListNode[k];
int index=0;
while(temp!=null){
nodes[index] = temp;
index = (index+1)%k;
temp = temp.next;
}
temp = nodes[index];
return temp;
}
}
反思
注意边界条件,比如使用栈时需要考虑:
- k = 0
- k > stack.size()
使用循环数组需要考虑:
- k = 0