链表的中间节点
链表的中间节点—力扣链接
题目内容:给定一个头结点为 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。
输入输出示例:
输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/middle-of-the-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码实现
方法一:快慢指针法
public ListNode middleNode(ListNode head) {
//俩个遍历的节点,一个以每次俩个节点的速度进行遍历,另外一个一次一个节点速度遍历;
//那么第二个到达终点的时候,慢的刚好到达中间节点
ListNode quick = head;//2倍遍历
ListNode cur = head;//正常遍历
while (quick != null && quick.next != null){
quick = quick.next.next;
cur = cur.next;
}
return cur;
}
方法二:数组存储法
- 这个方法比较好理解,但是空间复杂度太大。
- 并且不具备一定的通用性,因为题上面给了明确长度不超过100,才能使用;
//2.方法2,采用数组存储的方法
public ListNode middleNode(ListNode head) {
//因为链表最大长度是100
ListNode[] arr = new ListNode[100];
int index = 0;
while (head != null){
arr[index++] = head;
head = head.next;
}
return arr[index/2];
}