题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路:倒数第k个结点就是正数第n-k+1个结点,其中n是链表的长度。这里我们就需要先遍历链表得到它的长度。然后第二次遍历找到第n-k+1个就是倒数第k个结点。
// 链表中倒数第k个结点
public class Solution {
class ListNode {
int val;
ListNode next = null;
ListNode(int x) {
val = x;
}
}
public ListNode FindKthToTail(ListNode head, int k) {
if (head == null || k <= 0) {
return null;
}
// 得到链表长度
int count = 0;
ListNode node = head;
while (node != null) {
count++;
node = node.next;
}
if (count < k) {
return null;
}
ListNode pNode = head;
for (int i = 0; i < count - k; i++) {
pNode = pNode.next;
}
return pNode;
}
}
思路2:可以定义两个指针,一个快指针,一个慢指针。快指针先向前走k-1步,慢指针不动,从第k步开始,两个指针一起走。当快指针走到尾结点时,慢指针恰好走到倒数第k个。
public class Solution {
class ListNode {
int val;
ListNode next = null;
ListNode(int x) {
val = x;
}
}
public ListNode FindKthToTail(ListNode head, int k) {
if (head == null || k <= 0) {
return null;
}
// 定义两个指针
ListNode p1 = head;
ListNode p2 = head;
// 第一个指针向前走k-1步
for (int i = 0; i < k - 1; i++) {
p1 = p1.next;
}
if (p1 == null) {
return null;
}
while (p1.next != null) {
p1 = p1.next;
p2 = p2.next;
}
return p2;
}
}