题目:
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Given {1,2,3,4}
, reorder it to {1,4,2,3}
.
思路:把链表分成左右两部分,当链表元素个数为偶数时,左右两部分元素个数相同,当链表元素个数为奇数时,左部分元素个数比又部分多1个。将右部分链表翻转。最后将左右两部分链表元素轮流合并。
通过代码:
void reorderList(ListNode* head) {
if (head == NULL || head->next == NULL || head->next->next == NULL)return ;
ListNode* pre_head = new ListNode(0);
ListNode* p1 = head;
ListNode* p2 = head;
while (p2 != NULL&&p2->next != NULL&&p2->next->next != NULL) { //将链表分成左右两部分
p1 = p1->next;
p2 = p2->next->next;
}
ListNode* t = p1;
ListNode* s = p1->next;
t->next = NULL; //为了让右部分链表反转后链表尾为空,便于后面判断s到达链表尾调出循环
ListNode* temp = NULL;
while (s != NULL) { //将右部分链表翻转
temp = t->next;
t->next = s;
s = s->next;
t->next->next = temp;
}
s = t->next;
t->next = NULL;
ListNode* cur = head;
ListNode* p3 = pre_head;
while (s != NULL&&cur != NULL) { //链表合并
cur = cur->next;
p3 = p3->next;
p3->next = s;
s = s->next;
p3 = p3->next;
}
if (s != NULL) {
p3->next = s;
p3 = p3->next;
}
if (cur != NULL) {
p3->next = cur;
p3 = p3->next;
}
}