题目:
题解:快慢指针
- 解释一:
- 解释二:
- 解释三:
1. 在两个中间结点的时候,返回第二个中间结点:
public static ListNode middleNode(ListNode head) {
if(head == null)
{
return null;
}
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null)
{
// fast 一次前进两个元素,slow 一次前进一个元素
slow = slow.next;
fast = fast.next.next;
}
// 链表元素为奇数个时,slow 指向链表的中点
// 链表元素为偶数个时,slow 指向链表两个中点的右边一个
return slow;
}
2. 在两个中间结点的时候,返回第一个中间结点:
public static ListNode middleNode(ListNode head) {
if(head == null)
{
return null;
}
ListNode slow = head;
ListNode fast = head;
while(fast.next != null && fast.next.next != null)
{
// fast 一次前进两个元素,slow 一次前进一个元素
slow = slow.next;
fast = fast.next.next;
}
// 链表元素为奇数个时,slow 指向链表的中点
// 链表元素为偶数个时,slow 指向链表两个中点的左边一个
return slow;
}
代码:快慢指针
public class code876 {
public static ListNode middleNode(ListNode head) {
if(head == null)
{
return null;
}
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null)
{
// fast 一次前进两个元素,slow 一次前进一个元素
slow = slow.next;
fast = fast.next.next;
}
// 链表元素为奇数个时,slow 指向链表的中点
// 链表元素为偶数个时,slow 指向链表两个中点的右边一个
return slow;
}
private static ListNode createLinkedList(int[] arr) {// 将输入的数组输入到链表中
if (arr.length == 0) {
return null;
}
ListNode head = new ListNode(arr[0]);
ListNode current = head;
for (int i = 1; i < arr.length; i++) {// 过程
current.next = new ListNode(arr[i]);
current = current.next;
}
return head;
}
private static void printLinkedList(ListNode head) {// 将链表结果打印
ListNode current = head;
while (current != null) {
System.out.printf("%d -> ", current.val);
current = current.next;
}
System.out.println("NULL");
}
public static void main(String[] args) {
int[] x = { 1, 2, 3, 4, 5, 6 };
ListNode list = createLinkedList(x);
printLinkedList(list);
ListNode res = middleNode(list);
System.out.println(res.val);
}
}