双向链表的插入,删除,mergesort等。
#include<iostream>
using namespace std;
struct BiListNode
{
int val;
BiListNode *pre;
BiListNode *next;
BiListNode(int x) :val(x), pre(NULL), next(NULL){}
};
//双向链表的插入
BiListNode *insert(BiListNode *head, int num)
{
BiListNode *node = new BiListNode(num);
if (head == NULL) return node;
BiListNode *p = head;
while (node->val > p->val && p->next != NULL)
{
p = p->next;
}
if (node->val <= p->val)
{
//插入到头节点的位置
if (p == head)
{
node->next = head;
head->pre = node;
head = node;
}
//插入到中间位置
else
{
p->pre->next = node;
node->next = p;
node->pre = p->pre;
p->pre = node;
}
}
else //比哪个情况都大
{
p->next = node;
node->pre = p;
node->next = NULL;
}
return head;
}
//双向链表的删除
BiListNode *del(BiListNode *head, int num)
{
BiListNode *p = head;
while (p->next != NULL && num != p->val)
p = p->next;
if (num == p->val)
{
if (p == head)
{
head = head->next;
head->pre = NULL;
delete p;
}
else if (p->next == NULL)
{
p->pre->next = NULL;
delete p;
}
else
{
p->pre->next = p->next;
p->next->pre = p->pre;
delete p;
}
}
else
{
cout << "not found" << endl;
}
return head;
}
//将两个排序链表合并成为一个有序链表
BiListNode *merge(BiListNode *p1, BiListNode *p2)
{
if (!p1) return p2;
if (!p2) return p1;
BiListNode *head1 = p1, *head2 = p2;
BiListNode *head;
if (head1->val < head2->val)
{
head = head1;
BiListNode *p= merge(head1->next, head2);
head->next = p;
p->pre = head;
}
else
{
head = head2;
BiListNode *p= merge(head1, head2->next);
head->next = p;
p->pre = head;
}
return head;
}
BiListNode *mergeNonrecur(BiListNode *head1, BiListNode *head2)
{
if (!head1) return head2;
if (!head2) return head1;
BiListNode *head, *res;
if (head1->val < head2->val)
{
head = head1;
res = head;
head1 = head1->next;
}
else
{
head = head2;
res = head;
head2 = head2->next;
}
while (head1 != NULL && head2 != NULL)
{
if (head1->val < head2->val)
{
head->next = head1;
head1->pre = head;
head1 = head1->next;
head = head->next;
}
else
{
head->next = head2;
head2->pre = head;
head2 = head2->next;
head = head->next;
}
}
if (head1)
{
head->next = head1;
head1->pre = head;
}
else
{
head->next = head2;
head2->pre = head;
}
return res;
}
void print(BiListNode *head)
{
while (head != NULL)
{
cout << head->val << " ";
head = head->next;
}
cout << endl;
}
int main()
{
BiListNode *head1=NULL, *head2=NULL;
for (int i = 1; i <= 10; i += 2)
{
head1 = insert(head1, i);
}
head1 = insert(head1, 6);
for (int i = 2; i <= 10; i += 2)
{
head2 = insert(head2, i);
}
head2 = insert(head2,1);
head1 = del(head1, 3);
head2 = del(head2, 4);
BiListNode *head3 = mergeNonrecur(head1, head2);
print(head3);
print(head1);
print(head2);
system("pause");
return 0;
}