给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
解题思路;
前一半[0,(size+1)/2)的结点地址进入队列,先进先出,后一半[(size+1)/2,size)的结点入栈,先进先出。然后逐个取出就是题意中的顺序,注意最后一个结点取出后,它的next指针指向NULL,否者就有环。
class Solution { public: void reorderList(ListNode* head) { ListNode* p = head; int size = 0; while (p != NULL) { size++; p = p->next; } if (size<=2) return; p = head; queue<ListNode*> odd; stack<ListNode*> even; int nums = 1; while (p != NULL) { if (nums <=(size+1)/2) { odd.push(p); } else { even.push(p); } p = p->next; nums++; } nums = 1; p = new ListNode(0); while (!(odd.empty() && even.empty())) { if (nums % 2 == 1) { p->next = odd.front(); odd.pop(); } else { p->next = even.top(); even.pop(); } nums++; p = p->next; } p->next = NULL; } }; |