El título es el siguiente:
Dada una lista enlazada individualmente L: L0 → L1 →… → Ln-1 → Ln,
reorganícela para que sea: L0 → Ln → L1 → Ln-1 → L2 → Ln-2 →…
No puede simplemente cambiar el valor dentro del nodo, sino que realmente necesita intercambiar el nodo.
Dada una lista enlazada 1-> 2-> 3-> 4, reorganizarla en 1-> 4-> 2-> 3
Dada una lista enlazada 1-> 2-> 3-> 4-> 5, reorganizarla en 1 -> 5-> 2-> 4-> 3
Ideas para la resolución de problemas:
1. Encuentre el nodo central de toda la lista enlazada y el puntero q apunta al nodo del medio
2. Invierta la segunda mitad de la lista enlazada
3. Combine las dos listas enlazadas desensambladas.
void reorderList(ListNode *head)
{
if (head == NULL)
{
return;
}
ListNode *p= head;
ListNode *q= head;
while (p->next != NULL && p->next->next != NULL)
{
p = p->next->next;
q = q->next;
}
//此时的q就是指向中间结点
p= q->next;//p指向中间结点的下一个结点
q->next = NULL;//把前半段链表提取出来,整个链表拆成2部分
ListNode *s;
q= NULL; //当作前驱节点使用
while (p != NULL)
{
s = p->next;
p->next = q;
q = p;
p = s;
}
p = q; //p链表反转完毕
q = head;//q回到整条链表的头结点位置
while (p != NULL && q!= NULL)
{
s = q->next;
q->next = p; //q下一个链接p
q = s;
s =p->next;
p->next =q;
p = s;
}
}
El diagrama de demostración del código es el siguiente: