标签:依次 ack lse 访问 一个 ddl problem problems node
package 链表;
/**
* https://leetcode-cn.com/problems/middle-of-the-linked-list/
* 876. 链表的中间结点
*
*/
public class _876_Middle_of_the_Linked_List {
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
/**
* 官方题解
* 我们可以对链表进行两次遍历。第一次遍历时,我们统计链表中的元素个数 N;第二次遍历时,我们遍历到第 N/2 个元素(链表的首节点为第 0 个元素)时,将该元素返回即可。
*/
class Solution {
public ListNode middleNode(ListNode head) {
ListNode curr = head;
int n = 0;
while (curr != null) {
++n;
curr = curr.next;
}
int k = 0;
curr = head;
while (k < n / 2) {
++k;
curr = curr.next;
}
return curr;
}
}
/**
* 思路:采用快慢指针,刚开始都位于链表的第 1 个结点,一个永远一次只走 1 步,一个永远一次只走 2 步
*/
/*class Solution {
public ListNode middleNode(ListNode head) {
// 快指针
ListNode fast = head;
// 慢指针
ListNode slow = head;
while (fast.next != null) {
slow = slow.next;
if (fast.next.next != null) {
fast = fast.next.next;
} else {
fast = fast.next;
}
}
return slow;
}
}*/
/**
* 官方题解
* 思路:链表的缺点在于不能通过下标访问对应的元素。因此我们可以考虑对链表进行遍历,同时将遍历到的元素依次放入数组 A 中。
* 如果我们遍历到了 N 个元素,那么链表以及数组的长度也为 N,对应的中间节点即为 A[N/2]。
*/
/*public class Solution {
public ListNode middleNode(ListNode head) {
ListNode[] A = new ListNode[100];
int t = 0;
while (head != null) {
A[t++] = head;
head = head.next;
}
return A[t / 2];
}
}*/
}
标签:依次 ack lse 访问 一个 ddl problem problems node
原文地址:https://www.cnblogs.com/jianzha/p/12814011.html