0
点赞
收藏
分享

微信扫一扫

【链表】 经典面试题OJ

生命中最美的是成长 2022-03-19 阅读 44

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

代码如下:

 public ListNode FindKthToTail(ListNode head,int k) {
       if(head == null||k<0)return null;
        ListNode fast = head;
        //快指针先走k-1步
        while(k-1!=0 && fast!=null){ //这里当k大于链表长度时fast会指向null
            fast = fast.next;
            k--;
        }
        if(fast==null)return null;
        
        ListNode slow = head;
        while(fast.next!=null){
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
 }

2.给定一个链表,判断链表中是否有环。OJ链接

代码如下:

 public boolean hasCycle(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
        while(fast!=null&&fast.next!=null){
            fast = fast.next.next;
            slow = slow.next;
            if(fast==slow){
                return true;
            }
        }
        return false;
 }

3.给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL。OJ链接

代码如下:

  public ListNode detectCycle(ListNode head) {
        if(head == null){
            return null;
        }
        ListNode fast = head;
        ListNode slow = head;
        while(fast!=null&&fast.next!=null){
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow){ //相遇
                fast=head;    //fast开始从头节点走,slow从相遇节点继续走
                while(fast!=slow){
                    fast = fast.next;
                    slow = slow.next;
                }
                //第一次相遇的节点即为入环的第一个节点
                return fast;
            }
        }
        return null;
 }

欢迎大家指出其中的不足,也可以分享自己的想法!

举报

相关推荐

0 条评论