14 图解剑指Offer 链表中倒数第k个节点 Java题解
题目链接
题目描述
输入一个链表,输出该链表中倒数第k个结点。
题解:
//方法一:
1.首先要判断头节点是否为null,如果为null,直接返回null。
2.在遍历节点算出链表长度len,判断k是否大于len,如果大于len或k = 0返回null
3. 设定两个指针 pre after ,pre 先走到k节点
4.while循环 当 pre.next != null 时 , pre = pre.next after = after.next;
5.返回 after 即为倒数第k个节点
//方法二:
1.首先要判断头节点是否为null,如果为null,直接返回null。
2.在遍历节点算出链表长度len,判断k是否大于len,如果大于len或k = 0返回null
3. 设定一个指针 pre
4.for循环 pre走 len - k 步即可到达倒数第k个节点。
5.返回 prev
图解:
方法一:两个指针
方法二: 一个指针
代码:
/*
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) return null;
ListNode tempHead = head;
int len = 0;
while(tempHead != null) {
tempHead = tempHead.next;
len++;
}
if(k > len || k == 0) {
return null;
}
ListNode prev = head;
ListNode after = head;
for(int i = 1; i < k; i++) {
prev = prev.next;
}
while(prev.next != null) {
prev = prev.next;
after = after.next;
}
return after;
}
}
//方法二
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head == null) return null;
ListNode dummyHead = head;
int len = 0;
while(dummyHead != null){
len++;
dummyHead = dummyHead.next;
}
if(k==0 || k > len) {
return null;
}
ListNode pre = head;
for(int i = 0; i < len - k; i++) {
pre = pre.next;
}
return pre;
}
}
复杂度
空间复杂度: 空间复杂度为O(1)
最坏时间复杂度: 遍历时间复杂度O( n)