链表中倒数第k个结点

先遍历一遍链表,得到总的结点数,再找到倒数第k个几点就对应数值即可。边界条件为0.

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if(k == 0)
            return null;
        int count = 0;
        ListNode p = head;
        while(p != null){
            p = p.next;
            count++;
        }
        int t = count - k;
         p = head;
        ListNode pre = null;
        while(p != null && t >= 0){
            pre = p;
            p = p.next;
            t--;
        }
        return pre;
    }
}

在写代码的时候有个小错误:在第二个while循环体中没有写pre = p;这个条件,直接返回的p,结果肯定是null啊!

2、上面的方法使用了两次循环,如果要求使用一次遍历就得到了结果!
使用快慢指针,开始的时候都指向头结点,注意这里的头结点就是包含数据的第一个结点。然后让快指针先移动一段距离,使得两个指针的差距为k-1,即从当时的快指针位置向慢指针查第k个位置正好是慢指针。然后让两个指针一块向后移动,当快指针指向最后一个元素的时候,慢指针指向的就是倒数第k个元素!利用的是两指针之间的距离不变!代码如下:

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        ListNode fast = head;
        ListNode slow = head;
        if(head == null || k<=0){
            return null;
        }
        for(int i=0;i<k-1;i++){
            if(fast.next != null){
                 fast = fast.next;
            }else
                return null;            
        }
        while(fast.next != null){
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }
}

参考:https://www.cnblogs.com/mthoutai/p/6872784.html

本来想着链表倒序一下,直接输出第k个,但是发现不对,因为结果带着方向呢!比如说:{1,2,3,4,5},k=3,输出的是{3,4,5},而不是结点值!
正好总结一下倒置链表的算法:


 public void reverse(ListNode head,int k) {
        ListNode pre = null;
        while(head != null){
            ListNode t = head.next;//先存储下一位的值
            head.next = pre;//指针逆转
            pre = head;//先变换pre的值
            head = t;//后变换head的值
        }
}

猜你喜欢

转载自blog.csdn.net/xuchonghao/article/details/80143282