输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
样例代码是用hashMap实现了,在力扣中运行的时候发现效率和内存空间占用都比较大,但时间复杂度其实也是O(n)。如果想要更低的空间复杂度可以用两个循环,第一个循环遍历找到ListNode的长度为n,第二次循环的时候,就需要和输入的k进行对比,倒数第k个节点,则意味着返回正数第n-k+1个节点。当然如果k比n还要大,就没有节点满足条件了。这样的空间复杂度为O(1)。
package learnproject.offer;
import java.util.HashMap;
import java.util.Map;
/*
* 22.链表中的倒数第k个节点
*/
public class Demo22 {
/*
* 用一个hashMap即可
*/
public ListNode getKthFromEnd(ListNode head, int k) {
if(head == null) {
return null;
}
Map<Integer,ListNode> map = new HashMap<Integer,ListNode>();
int i =1;
ListNode temp = head;
while(true) {
map.put(i, temp);
i++;
temp = temp.next;
if(temp == null) {
break;
}
}
ListNode returnNode = map.getOrDefault(map.size()-k+1, null);
return returnNode;
}
public static void main(String args[]) {
Demo22 demo = new Demo22();
ListNode node1 = new ListNode(4);
ListNode node2 = new ListNode(5);
ListNode node3 = new ListNode(1);
ListNode node4 = new ListNode(9);
node1.next = node2;
node2.next = node3;
node3.next = node4;
ListNode newNode = demo.getKthFromEnd(node1, 2);
while(newNode!=null) {
System.out.println(newNode.val);
newNode = newNode.next;
}
}
}