一、题目描述
题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
二、思路
1、暴力解法
把链表遍历一遍,将所有节点存储在list中,然后取倒数第k个节点即可。这样做的时间复杂度为:O(n),空间复杂度为O(n)。 代码实现:
public static ListNode findKthToTail(ListNode head, int k) {
ArrayList<ListNode> list = new ArrayList<>();
while (head != null) {
list.add(head);
head = head.
;
}
int size = list.size();
if (size == 0 || size - k < 0 || k <= 0) {
return null;
}
return list.get(size - k);
}
2、快慢指针法
让fast指针快slow指针k个节点,那么在fast指针指向末尾null时,则说明slow指针当前已经指向了倒数第K个节点。 这种做法所需的时间复杂度是O(n),空间复杂度为O(1)。
public static ListNode findKthToTail(ListNode head, int k) {
if(head == null || k == 0){
return null;
}
ListNode p1 = head,p2 = head;
int i = 0;
while(i < k){
if(p1 == null){
return null;
}
p1 = p1.next;
i++;
}
while(p1!=null){
p1 = p1.next;
p2 = p2.next;
}
return p2;
}