Given a singly linked list L: (L0 , L1 , L2...Ln-1 , Ln). Write a program to reorder it so that it becomes(L0 , Ln , L1 , Ln-1 , L2 , Ln-2...).
Notes:
1、Space Complexity should be O(1)
2、Only the ".next" field of a node is modifiable.
代码:
- struct Node
- {
- int val_;
- Node* next;
- };
1、Space Complexity should be O(1)
2、Only the ".next" field of a node is modifiable.
代码:
- //转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/12190807
- struct Node
- {
- int val_;
- Node* next;
- };
- Node* reverse_list(Node* phead) //链表反转
- {
- Node *temp ,*curr , *pre , *reverse_head;
- pre = NULL;
- curr = phead;
- while(curr->next)
- {
- temp = curr->next;
- curr->next = pre;
- pre = curr;
- curr = temp;
- }
- curr->next = pre;
- reverse_head = curr;
- return reverse_head;
- }
- Node* Merge(Node* slow , Node* fast)
- {
- if(fast == NULL)
- return slow;
- if(slow == NULL)
- return fast;
- Node *head , *result;
- result = NULL;
- int i = 0;
- while(slow && fast)
- {
- if(0 == i)
- {
- if(NULL == result)
- {
- head = result = slow;
- slow = slow->next;
- }
- else
- {
- result->next = slow;
- slow = slow->next;
- result = result->next;
- }
- }
- else
- {
- if(NULL == result)
- {
- head = result = fast;
- fast = fast->next;
- }
- else
- {
- result->next = fast;
- fast = fast->next;
- result = result->next;
- }
- }
- i ^= 1;
- }//while
- if(slow)
- {
- result->next = slow;
- }
- if(fast)
- {
- result->next = fast;
- }
- return head;
- }
- Node* reorder_list(Node* phead)
- {
- Node *r_head , *slow , *fast;
- r_head = slow = fast = phead;
- while(fast->next != NULL && fast->next->next != NULL)
- {
- slow = slow->next;
- fast = fast->next->next;
- }
- if(slow->next == NULL)
- return r_head;
- fast = slow->next;
- slow->next = NULL;
- slow = phead;
- fast = reverse_list(fast); //链表的后半部分反转
- r_head = Merge(slow , fast); //链表归并
- return r_head;
- }