zoukankan      html  css  js  c++  java
  • 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述

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

    结点定义如下:

    public class ListNode {
        int val;
        ListNode next = null;
    
        ListNode(int val) {
            this.val = val;
        }
    }

    思路1:

    先遍历链表,计算其长度length;
    然后计算出倒数第k个结点就是正数第length - k + 1.
    最后再遍历链表,找到所求结点
    时间复杂度O(2n),需要遍历两次链表

    代码如下:

    public ListNode FindKthToTail(ListNode head,int k) {
    
            if(head == null || k <= 0){
                return null;
            }
            //直接遍历
            ListNode p = head;
            int length = 1;
            while(p.next != null){
                length++;
                p = p.next;
            }
    
    
            int index = length - k + 1;
            if(index <= 0){
                return null;
            }
    
            p = head;
            int num = 1;
            while(p.next != null && num < index){
                num++;
                p = p.next;
            }
    
            if(num < index){
                return null;
            }else{
                return p;
            }
    
        }

    思路2:

    期待只遍历链表一次就能得到。
    设置两个指针,一个初始化指向第一个结点,第二个指向第k个结点。然后两个指针同步向后移动,当第二个指向尾结点时,第一个指针即指向了倒数第k个结点

    代码:

        public ListNode FindKthToTail(ListNode head,int k) {
    
            if(head == null || k <= 0){
                return null;
            }
            //直接遍历
            ListNode p = head;
            ListNode q = head;
    
            for(int i = 0; i < k-1; i++){
    
                if(q == null){
                    return null;
                }
    
                q = q.next;
            }
    
            if(q == null){
                return null;
            }
            while(q.next != null){
                p = p.next;
                q = q.next;
            }
    
            return p;
    
    
        }

    思路3:

    将链表反转,那么原问题就变为求正数第k个结点。
    然而这改变了原本的链表,且并不会比思路2更高效

    链表反转:参考《剑指Offer:面试题16——反转链表(java实现)

  • 相关阅读:
    java中的成员变量和局部变量
    多线程实现输出当前时间,和猜数字游戏
    JDBC
    jQuery和原生JS的对比
    JavaScript有趣的知识点
    MySQL的数据类型
    行级元素和块级元素
    重定向和请求转发的区别
    JSP九大内置对象
    Python练习
  • 原文地址:https://www.cnblogs.com/wenbaoli/p/5655720.html
Copyright © 2011-2022 走看看