leetcode 876链表中间节点

876. 链表的中间结点

问题

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

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

思路一

求链表的中间节点,统计链表长度length,中间节点位于length/2+1处

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode middleNode(ListNode head) {
        if(head==null||head.next==null)
            return head;
        int length=0;
        ListNode temp=head;
        while(temp!=null)
        {
            length++;
            temp=temp.next;
        }
        int mid=length/2+1;
        for(int i=1;i<mid;i++)
            head=head.next;
        return head;
    }
}

思路二

上面思路相当于遍历了两遍链表,可以设置两个引用,一个快引用,一个慢引用,快引用每次步长为2,慢引用步长为1,当快引用到达链表尾时,慢引用正好到达链表中间

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode middleNode(ListNode head) {
        ListNode temp=head;
        while(temp!=null&&temp.next!=null)
        {
            head=head.next;
            temp=temp.next.next;
        }
        return head;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_21003657/article/details/88022374
今日推荐