力扣 876. 链表的中间结点

  1. 链表的中间结点
    给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
示例 2:

输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。

提示:

给定链表的结点数介于 1 和 100 之间。

方式一:这种先计算节点个数,在移动的方式我感觉是有问题的,但是在力扣提交是通过的,

class Solution {
    public static void main(String[] args) {
        ListNode head = new ListNode();
        ListNode l1 = new ListNode(1);
        ListNode l2 = new ListNode(2);
        ListNode l3 = new ListNode(3);
        ListNode l4 = new ListNode(4);
        ListNode l5 = new ListNode(5);
        ListNode l6 = new ListNode(6);
        head.next = l1;
        l1.next = l2;
        l2.next = l3;
        l3.next = l4;
        l4.next = l5;
        l5.next = l6;
        l6.next = null;

        ListNode listNode = new Solution().middleNode(head);
        while(listNode!=null){
            System.out.println(listNode.val);
            listNode = listNode.next;
        }
    }
    public ListNode middleNode(ListNode head) {
        int count=0;
        ListNode temp=head;
        // 先用for循环记录节点个数
        while(temp!=null){
            temp = temp.next;
            count++;
        }
        temp=head;
        // 然后将temp指针移动count/2个位置
        for(int i=0;i<count/2;i++){
            temp = temp.next;
        }
        return temp;
    }
}
class ListNode {
     int val;
     ListNode next;
     ListNode() {}
     ListNode(int val) { this.val = val; }
     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}

方法二:快慢指针,慢指针走1步,快指针走2步,当快指针不能走时,慢指针正好走到中点

class Solution {
    public ListNode middleNode(ListNode head) {
        ListNode slow = head, fast = head;
        while (fast!=null && fast.next!=null){
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }
}

你可能感兴趣的:(#,力扣,链表,leetcode,数据结构)