输入一个链表,输出该链表中倒数第k个结点。
简单粗暴的用另一个链表存储输入链表的逆序,然后返回逆序的第K个结点。
public class ListNode {
int val;
ListNode next = null;
ListNode(){}
ListNode(int val) {
this.val = val;
}
}
public static ListNode FindKthToTail(ListNode head, int k) {
if (head == null) return null;
LinkedList<ListNode> result = new LinkedList<>();
result.add(head);
while (head.next != null) {
ListNode ln = head.next;
result.add(ln);
head = ln;
}
if (k <= 0 || result.size() < k) return null;
else {
return result.get(result.size() - k );
}
}
使用两个指针,head,fast,先把fast的指针指向第k个元素,
然后head和fast同时向后遍历,当fast遍历到结尾时,
head正好遍历到倒数第k个。
public static ListNode FindKthToTailII(ListNode head, int k) {
if (head == null) return null;
ListNode fast = new ListNode();
ListNode low = head;
int i =0;
while (head.next!=null && i<=k-1){
fast = low;
low = low.next;
i++;
}
while (head.next != null && fast.next!=null) {
fast = fast.next;
head = head.next;
}
return head;
}