#include <iostream>
using namespace std;
typedef struct Node
{
int data;
struct Node *pNext;
}Node;
Node *createLink(Node a[],int n)
{
Node *head= &a[0];
for(int i = 0 ; i < n-1 ; i++)
{
a[i].pNext = &a[i+1];
}
a[n-1].pNext = NULL;
return head;
}
void printList(Node *head)
{
Node *p = head;
while(p != NULL)
{//这边不要写成p->pNext != NULL不然会少一个
cout<<p->data<<" ";
p = p->pNext;
}
cout<<endl;
}
//1、已知链表的头结点head,写一个链表逆序。
Node *reverseList(Node *head)
{
if(head == NULL || head->pNext == NULL)
{
return head;
}
Node *p1 = head;
Node *p2 = head->pNext;
Node *p3 = p2->pNext;
p1->pNext = NULL;//让链表头变为尾
while(p3 != NULL)
{
p2->pNext = p1;
p1 = p2;
p2 = p3;
p3 = p3->pNext;
}
p2->pNext=p1;//让链表尾变为头
head = p2;
//printList(head);
return head;
}
//2、已知两个链表head1和head2各自有序,请把它们合并成一个有序链表(保留所有节点,即使大小相同)
Node *Merge(Node *head1,Node *head2)
{
if(head1 == NULL)
{
return head2;
}
if(head2 == NULL)
{
return head1;
}
Node *head = NULL;
Node *p1 = NULL;
Node *p2 = NULL;
if(head1->data <= head2->data)//分清楚两个链表,谁的第一个链表大
{
head = head1;
p1 = head1->pNext;
p2 = head2;
}
else
{
head = head2;
p1 = head1;
p2 = head2->pNext;
}
Node* pCurrent = head;//确定目前链表的头在哪里
while(p1!=NULL && p2!=NULL)
{
if(p1->data <= p2->data)
{
pCurrent->pNext=p1;
p1 = p1->pNext;
}
else
{
pCurrent->pNext=p2;
p2 = p2->pNext;
}
}
if(p1->pNext != NULL)
{
pCurrent->pNext = p1;
}
if(p2->pNext != NULL)
{
pCurrent->pNext = p2;
}
return head;
}
int main()
{
Node a[8]={{1},{3},{5},{7},{9},{11},{13},{15}},*head;
Node b[8]={{2},{4},{6},{8},{10},{16},{17},{18}},*head1;
head = createLink(a,8);
printList(head);
head1 = createLink(b,8);
printList(head1);
printList(Merge(head,head1));//这一步并没有成功,百思不得姐
system("Pause");
return 0;
}