链表中倒数第k个节点(剑指Offer 第14 题)

来源:互联网 发布:联通语音网络类型 编辑:程序博客网 时间:2024/06/06 08:36

题目描述:


输入一个链表,输出该链表中倒数第k个结点。


解题思路:


主要介绍两种方法:

1. 链表逆序+前第k个节点(容易想到的)
2. 快慢指针


1 . 链表逆序 + 前第k个节点

这里面难度主要就是前面的链表逆序,先介绍它!
这里写图片描述
如上图,我们在遍历链表的同时,将链表进行逆序!主要分为以下几步:

public ListNode converseList(ListNode head){        ListNode newHead = null;//逆序链表的头节点,一开始为null,对应到图中的1指向的null。        while(head != null){//遍历原链表            ListNode newNode = head;//将遍历到的节点1先存起来(若不存,后面head很快就被覆盖掉了!)            head = head.next;//下一个节点(此时,节点1对于原链表任务已经结束,可以任意操作节点1了!)            newNode.next = newHead;//将节点1指向null            newHead = newNode;//将节点1设置为反转链表的头节点。        }        return newHead;    }

上面的注释,详细介绍了一个周期,后面的每个节点都是这个周期操作!
那么,后面找第k个就很简单了, 代码就不了附!


2 . 快慢指针

这里写图片描述

原理,见上面的图,应该能够一眼看明白了!
下面主要结合代码看看具体怎么实现!

public class Solution {    public ListNode FindKthToTail(ListNode head,int k) {        int count = 1;//快指针计数        ListNode fast = head;//快指针        ListNode slow = head;//慢指针        while(fast != null){            if(count > k){//此时,快指针到第k个节点,慢指针开始行动                slow = slow.next;            }            fast = fast.next;            count++;        }        if(count<=k)//循环结束后,要判断特殊情况,k值大于链表长度的情况            return null;        else            return slow;    }}

End