Таким образом, если вы видите весь код, mergeSort()
вызывается рекурсивно,
// Apply mergeSort on left list
node left = mergeSort(h);
// Apply mergeSort on right list
node right = mergeSort(nextofmiddle);
И, помещая middle.next = null
, он фактически прерывает рекурсию вызывающего метода в стеке методов.Таким образом, он вернет текущий узел, когда мы рекурсивно вызовем тот же метод,
if (h == null || h.next == null) {
return h;
}
Так что, если вы видите код psedo,
MergeSort(headRef)
1) If the head is NULL or there is only one element in the Linked List
then return.
2) Else divide the linked list into two halves.
FrontBackSplit(head, &a, &b); /* a and b are two halves */
3) Sort the two halves a and b.
MergeSort(a);
MergeSort(b);
4) Merge the sorted a and b (using SortedMerge() discussed here)
and update the head pointer using headRef.
*headRef = SortedMerge(a, b);
Это фактически разбивает список на 2 половины иПо отдельности MergeSort их вызывает тот же метод.Чтобы добиться того же, сначала скопируйте следующее значение в nextofmiddle
, и они заставят middle.next = null;
разорвать цикл рекурсии.
Надеюсь, это прояснит ваше сомнение.