【算法练操】找出链表中倒数第k个节点

399 阅读1分钟

题目:输入一个链表,需要输入倒数第k个节点

常规思路:遍历两遍链表,第一遍找出链表节点个数,第二遍找到目标节点

如果只允许遍历一次链表呢

思路二:很显然,遍历一次如果使用一个指针是没有办法解决了,这时候可以采样双指针的方法,也就是快慢指针,让快指针先走k-1步,再两个指针一起走,由于两者的间距是k,所以当快指针走到结尾处的时候慢指针刚好在倒数第k个位置,也就是链表的到是第k个节点

   //查找链表倒数第k个节点
    public Node findLastKFromend(Node head, int k){
        if (head == null || k == 0 || k > length(head))return null;
        Node header = head;

        Node behind = header; //后出发的指针
        Node pre = header; //先出发的指针

        //将先行节点移动k-1步
        for (int i = 0; i < k - 1; i ++){
            pre = pre.next;
        }

        //查找到倒数第k个节点
        while (pre != null && pre.next != null){
            pre = pre.next;
            behind = behind.next;
        }
        return behind;
    }

举一反三:查找链表的中间节点,也是采用双指针,快指针每次都两步,慢指针每次走一步,当快指针到结尾的时候,慢指针刚好在中间节点处

==tips:关于链表的查找,要时刻注意效率,从头到尾一步一步找肯定是最慢的,在必要的时候考虑双指针,会快很多。==