常见面试题:链表4-返回链表倒数k个节点(快慢指针、栈、暴力解法)
面试题中,链表的常问问题还有返回链表倒数k个节点,如果放在数组中,很容易实现,放在链表中,就需要通过一些方法了
一、解法1:暴力解法
首先能想到的就是类似于数组的结构,先求出链表的长度,然后判断要找的k个是否超过了链表的长度,最后找到第k个节点返回
public ListNode FindKthToTail (ListNode pHead, int k) {
int len = getNodeLength(pHead);
// 判断链表长度和k的带线啊哦
if(len < k) return null;
int ptr = len - k;
int cur = 0;
// 返回后k个节点
while(cur != ptr){
pHead = pHead.next;
cur += 1;
}
return pHead;
}
// 求得链表的长度
public int getNodeLength(ListNode head){
int len = 0;
while(head != null){
head = head.next;
len += 1;
}
return len;
}
二、解法2:快慢指针
声明两个指针,先把快指针前移k个节点,然后同时移动快慢两个指针,当快指针移动到结尾,慢指针的位置节点就是要返回的节点
public ListNode FindKthToTail (ListNode pHead, int k) {
// 快慢指针
ListNode fast = pHead, slow = pHead;
int ptr = 0;
while (fast != null){
fast = fast.next;
ptr = ptr+1;
// 当fast前移了k个,slow开始移动
if(ptr>k){
slow = slow.next;
}
}
// 如果链表长度小于k,返回null
if(ptr < k) return null;
return slow;
}
三、解法3:栈
可以把所有节点压入栈,然后进行出栈,当到k个出栈的节点,就是要返回的节点
public ListNode FindKthToTail (ListNode pHead, int k) {
// 链表为空或者k为0,返回null
if(pHead == null || k == 0) return null;
// 声明一个栈结构
Stack<ListNode> stack = new Stack<>();
// 入栈
while(pHead != null){
stack.push(pHead);
pHead = pHead.next;
}
// 链表长度和k比较
if(stack.size() < k) return null;
int ptr = 0;
// 出栈
while (ptr < k-1){
stack.pop();
ptr += 1;
}
// 返回第k个出栈节点
return stack.pop();
}
关于链表的算法题,万变不离其宗,要时刻把握住核心要点,属性next,这个是链表的核心所在