跳至主要內容

链表中倒数第K个节点

soulballad算法剑指Offer剑指Offer约 405 字大约 1 分钟

题目:

​ 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从 1 开始,即链表的尾结点是倒数第 1 个节点。例如,一个链表有6个节点,从头结点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第三个节点是值为 4 的节点。链表定义如下:

public class ListNode {
    public int value;
    public ListNode next;
}

分析:

​ 最常见的方法是先把整个链表遍历一遍,获取到链表的节点总数 n。然后在遍历第二次,获取第 n-k+1 个节点即可。这种方法要把链表遍历两次,虽然可以解决问题,但却不是最好的方案。

优化方案:

​ 定义两个指针 firts 和 second,first 从头开始遍历,移动 k-1 位后,second 开始移动。当 first 移动到链表的尾端时,second 刚好位于第 k 个节点上。代码实现如下:

public class GetLastNumNode {

    public static ListNode getNode(ListNode pHead, int k) {
		// 链表为空或者k=0,直接返回null
        if (null == pHead || k == 0) {
            return null;
        }

        ListNode firstNode = pHead;
        ListNode secondNode = pHead;

        int count = 0;
        while (firstNode.next != null) {
            // 当第一个节点移动到 k-1 位时,第二个节点开始移动
            if (count >= k - 1) {
                secondNode = secondNode.next;
            }

            firstNode = firstNode.next;
            count++;
        }
		// 如果k大于链表节点总数,count无法大于等于k-1,输入参数有误,返回null
        if (secondNode == pHead) {
            return null;
        }

        return secondNode;
    }
}
上次编辑于:
贡献者: soulballad