Reorder List

来源:互联网 发布:经济学推荐书籍 知乎 编辑:程序博客网 时间:2024/06/16 03:03
------QUESTION------

Given a singly linked list LL0L1→…→Ln-1Ln,
reorder it to: L0LnL1Ln-1L2Ln-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}.

------SOLUTION------
class Solution {public:    void reorderList(ListNode *head) {        if (!head|| !head->next)          return;            // partition the list into 2 sublists of equal length          ListNode *slowNode = head, *fastNode = head;          while (fastNode->next) {              fastNode = fastNode->next;              if (fastNode->next) {                  fastNode = fastNode->next;              } else {                  break;              }              slowNode = slowNode->next;          }          // 2 sublist heads          ListNode *head1 = head, *head2 = slowNode->next;          // detach the two sublists          slowNode->next = NULL;                // reverse the second sublist          ListNode *cur = head2, *post = cur->next;          cur->next = NULL;          while (post) {              ListNode* temp = post->next;              post->next = cur;              cur = post;              post = temp;          }          head2 = cur; // the new head of the reversed sublist                // merge the 2 sublists as required          ListNode* p = head1, *q = head2;          while (q ) {              ListNode *temp1 = p->next;              ListNode *temp2 = q->next;              p->next = q;              q->next = temp1;              p = temp1;              q = temp2;          }      }  };


0 0