Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-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}
.
基本思路分成三步:
(1)将链表拆分成两部分
(2)将后半部分进行逆转
(3)将两部分链表进行融合
#include<iostream>
using namespace std;
/**
* Definition for singly-linked list.
**/
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode * reverseLinkList(ListNode *head)
{
if(head==NULL || head->next == NULL)
return head;
ListNode *p = head;
ListNode *q = p->next;
ListNode *r = q->next;
p->next = NULL;
q->next = p;
while(r!=NULL)
{
p = q;
q = r;
r = r->next;
q->next = p;
}
head = q;
return head;
}
void reorderList(ListNode *head) {
//判断链表是否为空
if(head==NULL || head->next == NULL)
return;
/*
//首先将链表根据奇偶性分拆为两个链表
ListNode *listEven = head;
ListNode *listOdd = head->next;
ListNode *pEven = listEven;
ListNode *pOdd = listOdd;
while(pOdd->next != NULL)
{
pEven->next = pOdd->next;
pEven = pEven->next;
if(pEven->next!=NULL)
{
pOdd->next = pEven->next;
pOdd = pOdd->next;
}else{
break;
}
}
pEven->next = NULL;
pOdd->next = NULL;
*/
ListNode *listPrev = head;
ListNode *listBack = head;
ListNode *pPrev = listPrev;
ListNode *pBack = listBack;
while(pBack->next!=NULL && pBack->next->next!=NULL)
{
pPrev = pPrev->next;
pBack = pBack->next->next;
}
listBack = pPrev->next;
pPrev->next = NULL;
//将Back链表进行反转
listBack = reverseLinkList(listBack);
//将两个链表进行融合
pPrev = listPrev;
pBack = listBack;
ListNode *pBack2 = pBack->next;
while(pBack!=NULL)
{
pBack->next = pPrev->next;
pPrev->next = pBack;
pPrev = pPrev->next->next;
pBack = pBack2;
if(pBack2!=NULL)
pBack2 = pBack2->next;
}
}
void printList(ListNode *head)
{
ListNode *p = head;
while(p!=NULL)
{
cout << p->val << " " ;
p = p->next;
}
cout << endl;
}
int main(void)
{
ListNode *head;
head = (ListNode *)malloc(sizeof(ListNode));
head->val = 1;
head->next = NULL;
ListNode *p = head;
for(int i=2;i<5;i++)
{
ListNode *temp = (ListNode *)malloc(sizeof(ListNode));
temp->val = i;
p->next = temp;
p = p->next;
}
p->next = NULL;
printList(head);
reorderList(head);
printList(head);
system("pause");
return 0;
}