题解

方法一:
单链表只能向后遍历,只要知道倒数第k个节点是顺数第几个节点即可。

public ListNode FindKthToTail(ListNode head,int k) {
        ListNode  cur = head;
        int count = 0;
        //第一遍遍历统计链表节点个数
        while(cur != null){
            count++;
            cur = cur.next;
        }
        ListNode temp = null;
       //倒数第k个节点,顺数第count - k + 1个,可以自己举个例子
        for(int i = 1; i <= count - k + 1; i++){
               if(head != null){
               temp = head;
               head = head.next;
               }else{
                   temp = null;
               }
               }
        return temp;
    }

方法二:快慢指针
快指针先遍历k个节点,之后快慢指针(慢节点指向的是第一个节点,快指针指向的是第k+1个节点)一起遍历,当快指针跳出的时候,慢指针指向的就是倒数第k个节点。

public ListNode FindKthToTail(ListNode head,int k) {
        if(head == null || k == 0){
            return null;
        }
        //统计快指针遍历节点的个数
        int count = 0;
        ListNode fast = head;
        ListNode slow = null;
        while(fast != null){
            count++;
            fast = fast.next;
           if(count >= k){
               slow = head;
               head = head.next;
           }
        }
        return slow;
    }

方法二比方法一更需注意一些边界条件:k=0和k>链表的总长度。

全部评论

相关推荐

双非坐过牢:非佬,可以啊10.28笔试,11.06评估11.11,11.12两面,11.19oc➕offer
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务