剑指 Offer 22. 链表中倒数第k个节点

原题链接

题解

方式一:

最容易想到的是先遍历一遍链表求出链表的长度len, 倒数第k个节点(题目中说下表从1开始)就是顺序的len - k + 1个节点,然后再遍历一遍找到答案就行。
在本题中数据中的k好像没有超出链表长度的范围,所以不用判定就行了。如果题目中k有可能会超出范围,那么是需要特判的。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
        int res = 0;
        ListNode p = head;
        while(p != null){
            res ++;
            p = p.next;
        }
        int t = res - k;
        while((t --) != 0){
            head = head.next;
        }

        return head;
    }
}

方式二

可以使用双指针的方式,定义一个指向链表头指针p,先让p走k步,那么剩下p到链表的最后还有len - k步,刚好是head走len - k步就可以到达len - k + 1个结点,所以两个指针一起前进就行了。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
        ListNode p = head;
        while((k --) != 0){
            p = p.next;
        }

        while(p != null){
            head = head.next;
            p = p.next;
        }

        return head;
    }
}
如有错误,欢迎指正!
原文地址:https://www.cnblogs.com/Lngstart/p/14758267.html