#include <iostream>
using namespace std;
typedef struct Node
{
int value;
Node *next;
}Node;
Node* CreateSingleLinkedList(int array[], int length)
{
Node *p = new Node;
Node *head = NULL;
Node *t = p;
for (int i=0; i<length; i++)
{
Node *t = new Node;
t->value = array[i];
p->next = t;
p = t;
}
p->next = NULL;
head = t->next;
delete t;
return head;
}
void PrintSingleLinkedList(Node *head)
{
Node *p = head;
while (NULL != p)
{
cout << p->value << endl;
p = p->next;
}
}
Node* DeleteSingleLinkedList(Node *head, int value)
{
if (head == NULL) return head;
Node *p = head;
Node *q = p;
if (p->value == value)
{
head = p->next;
delete p; p = NULL;
}
else
{
while (p!=NULL&&p->value!=value)
{
q=p;
p=p->next;
}
if (p==NULL)
{}
else
{
q->next = p->next;
delete p; p=NULL;
}
}
return head;
}
Node* InsertSingleLinkedList(Node *head, int value)
{
Node *p = head;
Node *q = p;
Node * t = new Node;
t->value = value;
if (p == NULL)
{
//Node * t = new Node;
t->next = NULL;
//t->value = value;
head = t;
return head;
}
if (value < p->value)
{
//Node * t = new Node;
t->next = p;
//t->value = value;
head = t;
}
else
{
while (p!=NULL&&value<p->value)
{
q=p;
p=p->next;
}
if (p==NULL)
{
//Node * t = new Node;
t->next = NULL;
//t->value = value;
q->next = t;
}
else
{
//Node * t = new Node;
q->next = t;
t->next = p;
//t->value = value;
}
}
return head;
}
Node* ReverseSingleLinkedList(Node *head)
{
if (head==NULL || head->next==NULL)
{
return head;
}
Node *p1,*p2,*p3;
p1=head;
p2=p1->next;
while (p2)
{
p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
}
head->next=NULL;
head=p1;
return head;
}
Node* MergeTwoSingleLinkedList1(Node *head1, Node *head2)
{
if (head1==NULL) return head2;
if (head2==NULL) return head1;
Node * head = new Node();
Node * p = head1;
Node * q = head2;
Node * current = head;
while(p != NULL && q != NULL)
{
if (p->value>=q->value)
{
current->next=q;
current = q;
q=q->next;
}
else
{
current->next=p;
current = p;
p=p->next;
}
}
if (p!=NULL)
{
current->next = p;
}
if (q!=NULL)
{
current->next = q;
}
current = head;
head=head->next;
delete current; current=NULL;
return head;
}
Node* MergeTwoSingleLinkedList2(Node *head1, Node *head2)
{
if (head1==NULL) return head2;
if (head2==NULL) return head1;
Node *head = NULL;
if (head1->value<head2->value)
{
head=head1;
head->next = MergeTwoSingleLinkedList2(head1->next, head2);
}
else
{
head=head2;
head->next = MergeTwoSingleLinkedList2(head1, head2->next);
}
return head;
}
int main()
{
/*Create two SingleLinkedList*/
int array1[5] = {1, 3, 5, 7, 9};
int array2[10] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
//Create
Node * head1 = CreateSingleLinkedList(array1, 5);
Node * head2 = CreateSingleLinkedList(array2, 10);
//PrintSingleLinkedList(head1);
//PrintSingleLinkedList(head2);
cout<<endl;
//Delete first, last, middle till NULL¡Ê¡ÂÔ
//Insert from NULL, insert head, tail, middle, same¡Ê¡ÂÔ
//Reverse twice
// head1 = ReverseSingleLinkedList(head1);
//
// PrintSingleLinkedList(head1);
//
// head1 = ReverseSingleLinkedList(head1);
//
// PrintSingleLinkedList(head1);
//
// cout<<endl;
//Node * head = MergeTwoSingleLinkedList2(head1, head2);
Node * head = MergeTwoSingleLinkedList2(head1, head2);
PrintSingleLinkedList(head);
return 0;
}