面试题22:链表中倒数第k个结点
题目描述
输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。
链表结点定义如下:
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
问题分析
链表结构非常简陋,我们无法预知链表的长度。
在对k值的处理要多加小心:存在 k大于链表长度的情况。
这道题最直观的解法是 利用栈,将链表节点的值都存放在栈中,最后通过pop,找到我们想要的值。
另一种方法是维护两个距离为k-1的引用,同时往后进行移动,直到最近的引用指向了链表尾部(另一个引用自然指向了链表中倒数第k个结点)
问题解答
(1)通过栈
public ListNode FindKthToTail(ListNode head, int k) {
if(head==null || k<=0) {
return null;
}
int numbOfList=1;
Stack<ListNode> st = new Stack<>();
st.push(head);
ListNode node=head.next;
while(node != null){
numbOfList++;
st.push(node);
node=node.next;
}
if(k > numbOfList) {
return null;
}
else{
for(int i=1; i<=k; i++){
node=st.pop();
}
return node;
}
}
(2)通过两个引用
public ListNode FindKthToTail2(ListNode head,int k) {
if(head==null || k<=0) {
return null;
}
ListNode pAhead=head;
for(int i=1; i<k; i++){
pAhead=pAhead.next;
if(pAhead == null) {
return null;
}
}
ListNode pBehind = head;
while(pAhead.next!=null) {
pAhead=pAhead.next;
pBehind=pBehind.next;
}
return pBehind;
}
原文地址:https://www.cnblogs.com/JefferyChenXiao/p/12246348.html
时间: 2024-10-06 21:54:29