方法1:利用数组
方法2:利用快慢指针以及反转链表操作
import java.util.*;
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public void reorderList(ListNode head) {
// method1(head);
method2(head);
}
public void method1 (ListNode head) {
if (head == null) {
return;
}
ArrayList<ListNode> list = new ArrayList<>();
while (head != null) {
list.add(head);
head = head.next;
}
int left = 0;
int right = list.size() - 1;
while (left < right) {
list.get(left).next = list.get(right);
left++;
// 若 链表长度为偶数的情况下 则会提前相遇,此时已达到题目要求,直接终止循环
if (left == right) {
break;
}
list.get(right).next = list.get(left);
right--;
}
list.get(left).next = null;
}
public void method2 (ListNode head) {
if (head == null || head.next == null || head.next.next == null) {
return;
}
ListNode slowNode = head;
ListNode fastNode = head.next;
while (fastNode != null && fastNode.next != null) {
slowNode = slowNode.next;
fastNode = fastNode.next.next;
}
//将后半段链表反转
ListNode midNode = slowNode.next;
slowNode.next = null;
ListNode reverseNode = reverseNode(midNode);
ListNode tempReverseNode = null;
while (reverseNode != null) {
tempReverseNode = reverseNode.next;
reverseNode.next = head.next;
head.next = reverseNode;
head = reverseNode.next;
reverseNode = tempReverseNode;
}
}
public ListNode reverseNode (ListNode head) {
ListNode curNode = head.next;
ListNode preNode = head;
ListNode tempNode = null;
while (curNode != null) {
tempNode = curNode.next;
curNode.next = preNode;
preNode = curNode;
curNode = tempNode;
}
head.next = null;
return preNode;
}
} 


京公网安备 11010502036488号