博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

单链表操作

Posted on 2011-09-05 16:40  李大嘴  阅读(307)  评论(0编辑  收藏  举报
#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;
}