2020年10月26日 链表中倒数第k个结点

题目描述

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

思路一

简单方法,找倒数第k个转换成正数第i-k个 i为链表长度

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {

        if(head ==null || k<=0)
        {
            return null;
        }
        
        int i = 1;
        ListNode temp = head;
        while(temp.next!=null){
            i++;
            temp = temp.next;
        }
         if (i < k) return null;
        //输出第i-k+1的值
        temp = head;
        for(int j = 0;j<i-k;j++){
            temp =temp.next;
        }
        return temp;
    }
}

时间复杂度:O(2*n),n为链表的总长度,如果k总是在倒数第一个节点,那么此方法需要遍历链表2次
空间复杂度:O(1)

思路二

严格的O(n)解法,快慢指针
在这里插入图片描述
在这里插入图片描述
我们从图中可以看出,倒数第k个节点与最后的空节点之间有2个指针,此时的2正好就是k,于是我们可以想到可以通过平移来到达最后的状态。
如图:
在这里插入图片描述
如果懂了上面的过程,接下来再说说具体编程要怎么写?
在这里插入图片描述
使用如图的快慢指针,首先让快指针先行k步,然后让快慢指针每次同行一步,直到快指针指向空节点,慢指针就是倒数第K个节点。

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {

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

时间复杂度:O(n),不管如何,都只遍历一次单链表
空间复杂度:O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值