l链表节点结构:
public class ListNode {
int val;ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
这里介绍两种方法:
一种是:通过把链表的节点存起来,然后直接访问倒数第K个节点,这种方法的空间复杂度就比较高,但是相对更快一点
实例代码:
import java.util.ArrayList;
import java.util.List;
public class Solution {
//迭代
public ListNode FindKthToTail(ListNode head, int k) {
if (k== 0 ) return null ;
List<ListNode> list= new ArrayList<ListNode>();
while (head!= null )
{
list.add(head);
head=head.next;
}
if (list.size()<k) return null ;
return list.get(list.size()-k);
}
}
|
另一种是:使用两个指针都指向链表的头,指针1先移动k-1个节点,然后在和指针2一起移动,这样到指针1移动到指针末尾时,那指针2 的位置就是倒数第K个位置
实例代码:
public class Solution {
//两个指针一起后移
public ListNode FindKthToTail(ListNode head,int k) {
if(k==0) return null;
if(head==null) return null;
//两个指针
ListNode ln1=head;
ListNode ln2=head;
int count=0;
while(ln1.next!=null&&count<k-1)
{
count++;
ln1=ln1.next;
}
if(count<k-1) return null;
while(ln1.next!=null)
{
ln1=ln1.next;
ln2=ln2.next;
}
return ln2;
}
}