难度中等636
给定一个单链表 L
的头节点 head
,单链表 L
表示为:
L0 → L1 → … → Ln-1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入: head = [1,2,3,4] 输出: [1,4,2,3]
示例 2:
输入: head = [1,2,3,4,5] 输出: [1,5,2,4,3]
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverse(struct ListNode *head)
{
if(head == NULL)
return head;
struct ListNode* n1 = NULL;
struct ListNode* n2 = head;
struct ListNode* n3 = head->next;
while(n2)
{
n2 ->next = n1;
n1 = n2;
n2 = n3;
if(n3)
{
n3 = n3 -> next;
}
}
return n1;
}
void reorderList(struct ListNode* head)
{
if(head == NULL || head ->next == NULL)
return head;
struct ListNode* slow = head;
struct ListNode* fast = head;
while(fast != NULL && fast->next != NULL )
{
fast = fast ->next->next;
slow =slow ->next;
}
struct ListNode* first = head;
struct ListNode* sencond = slow->next;
slow->next =NULL;
sencond = reverse(sencond);
while(first != NULL && sencond != NULL)
{
struct ListNode* t = first->next;
struct ListNode* s = sencond->next;
sencond->next =t;
first->next =sencond;
sencond = s;
first = first->next->next;
}
}