1.题目
输入一个链表,输出该链表中倒数第k个结点。
如,输入:1,{1,2,3,4,5};返回:{5}
2.思路
方法一:我首先想到的是存入hashmap,然后直接对应键值来取值,由于是倒数的,所以要有长度记录
从0开始储存,记录长度为len,则找倒数第k个就是(len-k)个
时间复杂度:O(n),空间复杂度:O(n)
import java.util.*; public class Solution { public ListNode FindKthToTail(ListNode head,int k) { HashMap<Integer,ListNode> map=new HashMap<>(); int len=0;//起始位置 while(head!=null){ map.put(len,head); head=head.next; ++len;//记录链表长度 } return map.get(len-k); } }
方法二:快慢指针
快指针先走 k-1 步,到达第 k 个节点。
然后两指针同时齐步走,当快指针到达末尾时,慢指针在倒数第 k 个节点上。
public class Solution { public ListNode FindKthToTail(ListNode head,int k) { int index=k; int count=0;//记录链表长度 ListNode fast=head;//快指针 ListNode slow=head;//慢指针 while(fast!=null){ fast=fast.next; count++; if(index<1){ slow=slow.next; } --index; } if(k>count) return null;//如果目标位置大于链表长度 return slow; } }