144 재정렬 된 연결 목록

제목은 다음과 같습니다.
단일 연결 목록이 주어지면 L : L0 → L1 →… → Ln-1 → Ln,
L0 → Ln → L1 → Ln-1 → L2 → Ln-2 →…

노드 내부의 값만 변경할 수는 없지만 실제로 노드를 교환해야합니다.
연결된 목록 1-> 2-> 3-> 4가
주어지면 1-> 4-> 2-> 3으로 재정렬하십시오 연결된 목록 1-> 2-> 3-> 4-> 5가 주어지면 1로 재정렬하십시오 -> 5-> 2-> 4-> 3

문제 해결 아이디어 :
1. 전체 연결 목록의 중간 노드를 찾고 q 포인터가 중간 노드를
가리킴 2. 연결 목록의 두 번째 절반을 반전
3. 분해 된 두 연결 목록을 결합합니다.

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;
	}
}

코드 데모 다이어그램은 다음과 같습니다.
여기에 사진 설명 삽입

추천

출처blog.csdn.net/LINZEYU666/article/details/112972253