思路1:遍历两次,第一次获取链表长度,第二次找出该节点时间,2O(n)
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
if(head==null)
return null;
ListNode temHead=head;
int len=0;
while(temHead!=null)
{
temHead=temHead.next;
len++;
}
int x=len-k;
while(x>0)
{
head=head.next;
x--;
}
return head;
}
}
思路二:一次遍历,双指针,先让temHead指针先走K步,接着temHead和head指针一起走N-K步,temHead链表刚好遍历完,而head指针走了N-K步,刚好是倒数第K个节点
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode fast=head;
ListNode slow=head;
while(fast!=null&&k>0)
{
fast=fast.next;
k--;
}
while(fast!=null)
{
fast=fast.next;
slow=slow.next;
}
return slow;
}
}
返回的是倒数K个节点起始的链表,不需要使用头结点