题目描述
输入一个链表,输出该链表中倒数第k个结点。
示例1
- 输入
1,{1,2,3,4,5}
- 返回值
{5}
解题思路
(1)直接循环
遍历,计算出总共有n个结点,再遍历一次,找到n-k个结点。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head == null || k <= 0)
return null;
ListNode p = head; int n = 0;
while(p != null) {
p = p.next;
n++;
}
if(n < k)
return null;
n -= k;
while(n != 0) {
n--;
head = head.next;
}
return head;
}
}
(2)快慢指针
开始设置两个指针相差k个位置,当快指针移动到最后一个结点,慢慢指针移动到倒数第k个结点。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head == null || k <= 0)
return null;
ListNode p = head, q = head;
while((k--) != 0) {
if(q != null)
q = q.next;
else
return null;
}
while(q != null) {
q = q.next;
p = p.next;
}
return p;
}
}
代码
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head == null || k <= 0)
return null;
ListNode p = head, q = head;
while((k--) != 0) {
if(q != null)
q = q.next;
else
return null;
}
while(q != null) {
q = q.next;
p = p.next;
}
return p;
}
}