public class Solution {
/**
* 分析 :
*
* 1、倒数第k个节点,即正数第length-k+1个节点,只需要从第1个节点,走到正数第length-k+1个节点
* 2、从第1个节点,向前走n-1步,便会走到第n个节点
* 3、所以从第一个节点,向前走length-k步,便会走到正数第length-k+1个节点,
*
* 4、从第1个节点走到第length个节点,即最后一个节点,需要走length-1步
* 5、令快指针n1先走(length-1)-(length-k)=k-1步,此时快指针走到正数第k个节点,同时还须再走length-k步就会走到最后一个节点
* 6、令慢指针n2和快指针n1同时走,当快指针n1走到末尾时,正好走了length-k步,n2同时也走了length-k步,此时n2从1走到length-k+1,即倒数第k个节点
*
*/
public static ListNode FindKthToTail(ListNode head, int k) {
// 如果k<=0或链表头结点为null,则直接返回null
if (k <= 0 || head == null) {
return null;
}
// 设置两个指针
ListNode n1 = head;
ListNode n2 = head;
// 先将第一个指针向前走k-1步,每走一步,则要检查是否走到了链表末尾的null处
for (int i = 1; i <= k - 1; i++) {
n1 = n1.next;
if (n1 == null) {
return null;
}
}
// n1再走length-k步,便会走到最后一个结点
// n2走length-k步,便会走到length-k+1个结点
while (n1.next != null) {
n1 = n1.next;
n2 = n2.next;
}
return n2;
}
public static void main(String[] args) {
ListNode n1 = new ListNode(1);
ListNode n2 = new ListNode(2);
ListNode n3 = new ListNode(3);
ListNode n4 = new ListNode(4);
ListNode n5 = new ListNode(5);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
System.out.println(FindKthToTail(n1, 6));
}
}
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
@Override
public String toString() {
return "ListNode [val=" + val + "]";
}
}
[编程题]链表中倒数第k个结点
最新推荐文章于 2024-11-14 13:49:39 发布