Java单链表查找中间值
时间: 2024-09-25 21:18:56 浏览: 53
在Java中,单链表查找中间值通常涉及到遍历链表,因为不像数组可以直接通过索引访问元素,链表需要从头节点开始逐个访问直到找到中间位置。这里提供一种常见的方法:
```java
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public ListNode findMiddleNode(ListNode head) {
if (head == null || head.next == null) {
return head; // 如果链表为空或只有一个元素,直接返回头节点
}
// 创建两个指针,快慢指针,快指针每次走两步,慢指针每次走一步
ListNode slow = head;
ListNode fast = head.next;
// 当快指针到达链表末尾时,慢指针正好位于链表的中间
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow; // 返回慢指针指向的节点即为中间值
}
```
这个算法的时间复杂度是O(n),其中n是链表的长度。因为无论链表有多长,快慢指针最终都会相遇在链表的中间。
相关问题
Java单链表查找中间值快慢指针和计数法
在Java中,寻找单链表的中间节点通常有两种常用方法:快慢指针法(也称为龟兔赛跑算法)和双指针法,其中一种就是计数法。
**快慢指针法:**
这种方法利用两个指针,一个快速指针每次移动两步,另一个慢速指针每次移动一步。当链表长度为奇数时,相遇的那个点就是中间节点;如果链表长度为偶数,那么当快速指针到达尾部时,慢速指针刚好位于链表的中间位置。
**计数法:**
这种方法需要预处理链表长度,通过遍历链表同时计算元素个数。可以维护两个指针,一个普通遍历,一个记录已访问元素的数量,当已访问元素数量等于链表总长度的一半时,此时的指针指向的就是中间节点。
下面是简单的代码示例:
```java
// 使用快慢指针法
public ListNode findMiddleNode(ListNode head) {
if (head == null || head.next == null) return head;
ListNode slow = head, fast = head.next;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow; // 返回慢指针,即中间节点
}
// 使用计数法(假设有一个已经计算好链表长度的函数ListNode length(ListNode head))
public ListNode findMiddleNode(ListNode head, int length) {
ListNode current = head, count = 0;
while (current != null) {
count++;
current = current.next;
}
current = head;
for (int i = 0; i < length / 2; i++) {
current = current.next;
}
return current; // 返回当前节点,即中间节点
}
```
java实验编程1、 有一个长度大于2的整数单链表L,设计一个算法查找L中中间位置的元素。 2、有一个整数单链表L,其中可能存在多个值相同的结点,设计一个算法查找L中最大值结点的个数。
1、算法描述:
定义两个指针slow和fast,初始时都指向链表的头结点。
fast指针每次移动两个节点,slow指针每次移动一个节点,直到fast指针到达链表末尾。
此时,slow指针所指向的节点就是链表的中间节点。
算法实现:
public ListNode findMiddleNode(ListNode head) {
if(head == null || head.next == null) {
return head;
}
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
2、算法描述:
定义一个变量max记录链表中的最大值,初始化为链表头结点的值,定义一个变量count记录最大值结点的个数,初始化为1。
从链表的第二个结点开始遍历,如果当前结点的值等于max,则count加1;如果当前结点的值大于max,则将max更新为当前结点的值,count重置为1。
遍历完成后,count的值即为链表中最大值结点的个数。
算法实现:
public int findMaxNodeCount(ListNode head) {
if(head == null) {
return 0;
}
int max = head.val;
int count = 1;
ListNode p = head.next;
while(p != null) {
if(p.val > max) {
max = p.val;
count = 1;
} else if(p.val == max) {
count++;
}
p = p.next;
}
return count;
}
阅读全文
相关推荐

















