《剑指offer》之链表中倒数第k个结点

《剑指offer》之链表中倒数第k个结点

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

分析:倒数第k个节点,也就是正数的第n-k+1个节点(链长为n),例如:在n=6的链表中,倒数第2个节点就是正数第5个节点(6-2=1)。

解决方案:

  • 直接遍历法:先遍历一遍链表获得链表长n,然后再从头开始遍历第n-k+1个节点。

    代码:

    public ListNode FindKthToTail(ListNode head,int k) {
        ListNode pre = head;
        ListNode last =head;
        int count = 0;
        if(head == null || k <= 0){
            return null;
        }
        while(pre  != null){                     
            pre = pre.next;
            count++;
        }
        if(k>count){
            return null;
        }
        for(int i =1;i<count-k+1;i++){
            last = last.next;
        }
        return last;
    }
    

    性能测试分析:

    运行时间:26ms
    占用内存:9280k
    
  • 类似于第一种方法的变形:使用两个指针,指针A先进行遍历,当遍历到第k-1个数时,指针B开始从头遍历。当指针A到达链表尾的时候,指针B的位置就刚好为倒数第k个数。

    代码:

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

    性能测试分析:

    运行时间:24ms
    占用内存:9552k
    
  • 使用堆栈。对链表进行遍历并存入堆栈中,然后再从堆栈中弹出k个元素(这种方法需要注意链表的长度是否会造成堆栈的溢出)

    代码:

    public ListNode FindKthToTail(ListNode head,int k) {
        ListNode pre = head;
        ListNode last = null;
        int count = 0;
        Stack stack = new Stack();
        if(head == null || k <= 0){
            return null;
        }
        while(pre != null){                     
            stack.push(pre);
            pre = pre.next;
            count++;
        }
        //判断k是否超过链表长度
        if(k>count){
            return null;
        }
        for(int i =1;i<=k;i++){
            last = (ListNode) stack.pop();
        }
        return last;
    }
    

    测试性能分析:

    运行时间:25ms
    占用内存:9576k
    
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值