제목은 다음과 같습니다.
단일 연결 목록이 주어지면 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;
}
}
코드 데모 다이어그램은 다음과 같습니다.