Дан односвязный список L: L0 → L1 →… → Ln-1 → Ln,
изменить его на L0 → Ln → L1 → Ln-1 → L2 → Ln-2 →…
Вы не можете изменять значения в узлах списка, только узлы могут быть изменены.
Мое решение что-то вроде этого.
Я понял, что сначала мы находим средний элемент, затем переворачиваем список со следующего элемента с середины на конец, а затем объединяем их, но мой вопрос в том, что если основной функцией было что-то вроде public ListNode reorderList (ListNode голова) , то что я должен вернуть, чтобы получить весь список. Спасибо заранее.
class Solution {
public void reorderList(ListNode head) {
if (head == null || head.next == null) {
return;
}
ListNode mid = findMiddle(head);
ListNode tail = reverse(mid.next);
mid.next = null;
merge(head, tail);
}
//to find the middle node of linked list
private ListNode findMiddle(ListNode head) {
ListNode slow = head;
ListNode fast = head.next;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
//to reverse the nodes in linked list
private ListNode reverse(ListNode head) {
ListNode prev = null;
ListNode curr = head;
ListNode next = null;
while(curr!=null){
next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
head = prev;
return head;
}
//to merge both the start and tail node.
private void merge(ListNode headA, ListNode headB) {
ListNode dummy = new ListNode(0);
while (headA != null && headB != null) {
dummy.next = headA;
headA = headA.next;
dummy = dummy.next;
dummy.next = headB;
headB = headB.next;
dummy = dummy.next;
}
if (headA != null) {
dummy.next = headA;
} else if (headB != null) {
dummy.next = headB;
}
}
}