1. 链表的中点

使用快慢指针寻找链表的中点有2种方式,分别是fast=head; fast=head.next;

1. fast = head;

    public ListNode findMidNodeFromHead(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        while ((fast != null) && (fast.next != null)) {
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }

2. fast = head.next;

    public ListNode findMidNodeFromHeadNext(ListNode head) {
        ListNode slow = head;
        ListNode fast = head.next;
        while ((fast != null) && (fast.next != null)) {
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }

这2种方式寻找链表的结点主要区别是 当链表的长度为奇偶数时,找到链表中点的位置一个靠后,一个靠前。

当链表为奇数时  [1->2->3->4->5]

        //odd number length
        ListNode oddMidFromHead = findMidNodeFromHead(head2);
        ListNode oddMidFromHeadNext = findMidNodeFromHeadNext(head2);
        System.out.println("oddMidFromHead=" + oddMidFromHead + " oddMidFromHeadNext=" + oddMidFromHeadNext);

         //output
        oddMidFromHead=[3->4] oddMidFromHeadNext=[3->4]

当链表长度为奇数时,找到的中点2种方式是一样的。

当链表为偶数时   [1->2->3->4]

        //even number length
        ListNode evenMidFromHead = findMidNodeFromHead(head);
        ListNode evenMidFromHeadNext = findMidNodeFromHeadNext(head);
        System.out.println("evenMidFromHead=" + evenMidFromHead + " evenMidFromHeadNext=" + evenMidFromHeadNext);

        //output
        evenMidFromHead=[3->4] evenMidFromHeadNext=[2->3]

当链表的长度为偶数时,head找到的中点是靠后的,因为fast相对slow移动只快了1步,而head.next找到的中点是靠前的,因为fast相对slow移动快了2步。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐