题目描述
输入一个链表,输出该链表中倒数第k个结点。
package com.hwx.swordToOffer._14_FindKthFromTail;
/*
* 题目描述:
输入一个链表,输出该链表中倒数第k个结点
*/
public class Solution {
public static void main(String[] args) {
}
/*
* {1,2,3,4,5}
* 大神的方法:
* 定义两个结点都指向头节点,先让第一个p移动k个,然后p和pre一起移动。
* 到最后时,p指向空节点(重要!!!边界问题,p指向空),pre指向倒数第k个
*/
public ListNode FindKthToTail(ListNode head, int k) {
ListNode p = head;
ListNode pre = head;
int i = 0;
for (; p != null; i++) {
if (i >= k) {//此时p已经先移动了k步,这时两个一起走
pre = pre.next;
}
p = p.next;//p总是要走的,并且最后指向null
}
return i < k ? null : pre;//i的值为节点的数目。如果k大于节点数目返回空;否则返回pre
}
/*{1,2,3,4,5}
* 我的方法:简单易懂,但是不好,需要循环两次,时间复杂度为2*O(logN)。方法1的时间复杂度为O(logN)
* 先计算出节点的个数count,倒数第k个节点即正数第count+1-k个节点,cur需要再移动count-k次即为所求节点
*
*/
public ListNode FindKthToTail2(ListNode head, int k) {
int count = 0;
if (head == null) {
return null;
}
ListNode cur = head;
while (cur != null) {
count++;
cur = cur.next;
}
if (k > count) {
return null;
}
for (int i = 0; i < count - k; i++) {
head = head.next;
}
return head;
}
}
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}