链表

 

题1:已知链表的头节点head,写一个函数把这个链表逆序

#include<iostream>

using namespace std;

typedef struct Node
{
    int data;
    struct Node *next;
}Node;

Node* CreatList(int n)
{
    //创建链表
    Node* L= new (Node);    //(Node*)malloc(sizeof(Node))
    cout<<"please input data:";
    cin>>L->data;
    L->next=NULL;
    Node* p;
    for(int i=n-1;i>0;i--)
    {
        p= new (Node);
        cout<<"please input data:";
        cin>>p->data;
        p->next=L;
        L=p;
    }
    return L;
}

Node* ReverseList(Node *head)
{
    Node* p1=head;
    Node* p2=p1->next;
    Node* p3=p2->next;
    p1->next=NULL;
    while(p3)
    {
        p2->next=p1;
        p1=p2;
        p2=p3;
        p3=p3->next;
    }
    p2->next=p1;
    head=p2;
    return head;
}

int main()
{
    Node* head=CreatList(10);
    head=ReverseList(head);
    return 0;
}

 

题2:已知两个链:List1 和List2 各自有序,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同)

#include<iostream>

using namespace std;

typedef struct Node
{
    int data;
    struct Node *next;
}Node;

Node* CreatList(int n)
{
    //创建一个带头节点的链表
    Node* L= new (Node);    //(Node*)malloc(sizeof(Node))
    L->next=NULL;
    Node* p;
    for(int i=n;i>0;i--)
    {
        p= new (Node);
        cout<<"please input data:";
        cin>>p->data;
        p->next=L->next;
        L->next=p;
    }
    return L;
}

Node* MergeList(Node* L1,Node* L2)
{   //假设L1和L2的元素按值非递减
    Node* p1=L1->next;
    Node* p2=L2->next;
    Node* L3=L1;              //用L1的头节点作为L3的头节点
    Node* p3=L1;              //保存要插入的位置
    while(p2&&p1)
    {   
        if(p1->data>=p2->data)
        {
            p3->next=p2;
            p3=p2;
            p2=p2->next;
        }
        else
        {
            p3->next=p1;
            p3=p1;
            p1=p1->next;
        }
    }
    p3->next=p1?p1:p2;
    delete L2;
    return L3;
}
int main()
{
    Node* List3;
    Node* List1=CreatList(4);
    Node* List2=CreatList(4);
    List3=MergeList(List1,List2);
    return 0;
}

 

posted on 2013-09-03 15:20  大浪 淘沙  阅读(224)  评论(0编辑  收藏  举报

导航