c_cpp 给定单链表L:L0→L1→...→Ln-1→Ln,将其重新排序为:L0→Ln→L1→Ln-1→L2→Ln-2→......必须在不改变的情况下就地执行此操作节点
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 给定单链表L:L0→L1→...→Ln-1→Ln,将其重新排序为:L0→Ln→L1→Ln-1→L2→Ln-2→......必须在不改变的情况下就地执行此操作节点相关的知识,希望对你有一定的参考价值。
void reorderList(ListNode *head) {
if(!head || !head->next) return;
// step1: get middle node and its previous node, cut to 2 halves.
ListNode *p = head, *q = head, *tail = NULL; // cannot write *q=head->next
while(q && q->next) {
tail = p;
p = p->next;
q = q->next->next;
}
tail->next = NULL; // gist1
// step2: reverse the 2nd half
ListNode *pre = NULL, *cur = p;
while(cur) {
ListNode *nxt = cur->next;
cur->next = pre;
pre = cur;
cur = nxt;
}
// step3: merge the 2 halves
ListNode *right_half = pre;
ListNode *p1 = head, *p2 = right_half;
bool use_left = false; // gist2
while(p1 && p2) {
if(use_left == false) {
ListNode *nxt = p1->next;
p1->next = p2;
p1 = nxt;
}
else if(use_left == true) {
ListNode *nxt = p2->next;
p2->next = p1;
p2 = nxt;
}
use_left = !use_left;
}
}
以上是关于c_cpp 给定单链表L:L0→L1→...→Ln-1→Ln,将其重新排序为:L0→Ln→L1→Ln-1→L2→Ln-2→......必须在不改变的情况下就地执行此操作节点的主要内容,如果未能解决你的问题,请参考以下文章
143. 重排链表
leetcode中等143重排链表
leetcode中等143重排链表
LeetCode——reorder-list
Leetcode No.143 重排链表
LeetCode 0143. 重排链表