144 lista enlazada reorganizada

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:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/LINZEYU666/article/details/112972253
Recomendado
Clasificación