题目:将给定的单链表L: L 0→L 1→…→L n-1→L n,
重新排序为: L 0→L n →L 1→L n-1→L 2→L n-2→…
要求使用原地算法,并且不改变节点的值。例如:对于给定的单链表{1,2,3,4},将其重新排序为{1,4,2,3}.
思路:先找到链表的中间结点,然后对后半部分进行逆序,随后把后半部分与前半部分进行交叉合并。这里解释一下原地算法,原地算法不依赖额外的资源或者依赖少数的额外资源,仅依靠输出来覆盖输入的一种算法操作。也就是说,我们不能开辟新的链表空间,只能将原有链表进行操作然后输出。
实现过程:
我们先来实现链表的逆序
void reverseList(ListNode* head) {//链表的逆序
ListNode* pre, * cur, * post;//pre指向修改指针结点的前一个结点指针,cur是指向当前操作结点的指针,post是指向修改结点的后一个结点的指针
pre = head;
cur = head->next;
post = cur->next;
while (post) {
cur->next = pre;
pre = cur;
cur = post;
post = post->next;
}
cur->next = pre;
head->next->next = NULL;
head->next = cur;
}