描述
Given a singly linked listL0 L1 ...Ln;reorder it to:L0 Ln L1 Ln-1...
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].
Given a singly linked listL0 L1 ...Ln;reorder it to:L0 Ln L1 Ln-1...
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].
#include<iostream>
using namespace std;
struct node
{
int data;
node *next;
};
class mylist
{
node *head;
public:
mylist()
{
head = new node();
head->next = NULL;
}
void CreateList(int a[], int n);
void Display();
friend void ReorderList(mylist &list);
~mylist();
};
void mylist::CreateList(int a[], int n)
{
node *p = head;
node *temp = head;
for (int i = 0; i < n; i++)
{
node *q = new node();
q->data = a[i];
p->next = q;
p = q;
}
p->next = NULL;
}
void mylist::Display()
{
node *p = head->next;
while (p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
void ReorderList(mylist &list)
{
int length = 0;
node *p = list.head->next;
while (p)
{
length++;
p = p->next;
}
//===
int lasthalf = length / 2;
int firsthalf = length - lasthalf;
p = list.head->next;
node *firsthalfend = list.head;
node *lasthalfbegin = NULL;
for (int i = 1; i <= firsthalf; i++)
{
firsthalfend = firsthalfend->next;
}
lasthalfbegin = firsthalfend->next;
firsthalfend->next = NULL;
//===
list.head->next = NULL;
while (lasthalfbegin)
{
node *temp = lasthalfbegin->next;
lasthalfbegin->next = list.head->next;
list.head->next = lasthalfbegin;
lasthalfbegin = temp;
}
lasthalfbegin = list.head->next;
list.head->next = p;
//===
while (p&&lasthalfbegin)
{
node *temp1 = p;
node *temp2 = lasthalfbegin;
p = p->next;
lasthalfbegin = lasthalfbegin->next;
temp1->next = temp2;
temp2->next = p;
}
}
mylist::~mylist()
{
node *p = head;
while (p)
{
node *temp = p->next;
delete p;
p = temp;
}
}
int main()
{
//===
const int n = 4;
int a[n] = { 1, 2, 3, 4};
mylist list;
list.CreateList(a, n);
list.Display();
cout << endl;
//===
ReorderList(list);
list.Display();
cout << endl;
}