给定一个单链表L: L0→L1→…→Ln-1→Ln,
重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…
必须在不改变节点值的情况下进行原地操作。
class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: void
*/
void reorderList(ListNode *head) {
// write your code here
if(head == NULL){head = NULL;}
else{
ListNode *mid = getmid(head);
ListNode *se = mid->next;
mid->next = NULL;
ListNode *fr = head;
ListNode *rese = reverse(se);
head = merge(fr,rese);
}
}
ListNode *reverse(ListNode *head){
ListNode *prev = NULL;
while(head != NULL) {
ListNode *temp = head->next;
head->next = prev;
prev = head;
head = temp;
}
return prev;
}
ListNode *merge(ListNode *a,ListNode *b){
ListNode *dummy = new ListNode(0);
ListNode *p = dummy;
while(a != NULL && b != NULL){
p->next = a;
a = a->next;
p = p->next;
p->next = b;
b = b->next;
p = p->next;
}
if(b != NULL){
p = b;
}
return dummy->next;
}
ListNode *getmid(ListNode *head){
ListNode *fast = head->next;
ListNode *slow = head;
while(fast != NULL && fast->next != NULL && fast->next->next != NULL){
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
};
注意点:1. reorder list这个函数没有返回值,因此使用if语句判断head是否等于NULL,后面的情况要用else语句。