【在线编程】链表中倒数第k个结点
【问题描述】
输入一个链表,输出该链表中倒数第k个结点。
【解题思路 & Java实现】
注意特殊情况:链表为空,k>链表长度
方法一:倒数第k个就是顺数第n-k+1个,遍历两次列表。时间复杂度 O(n).
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head, int k) {
ListNode p = head;
int length = 0;
while (p != null) {
length++;
p = p.next;
}
if (head == null || k <= 0 || k > length) {
return null;
}
int count = length - k;
while (count > 0) {
head = head.next;
count--;
}
return head;
}
}
方法二:快慢指针 fast 先走k步 当fast 走到null的时候,slow刚好就是倒数第k个节点。时间复杂度O(n).
/*
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 fast = head;
ListNode slow = head;
//1. fast先向前走 k 步,
while (k > 0) {
if (fast != null) {
fast = fast.next;
k--;
} else { // k 大于链表长度
return null;
}
}
//2. fast 走到null时,slow 刚好就是倒数第k个结点
while (fast != null) {
fast = fast.next;
slow = slow.next;
}
return slow;
}
}