单链表 简单题(单链表基本操作)

题目描述:

有一个带头结点的单链表L=(a1,b1,a2,b2,......an,bn),设计一个算法将其拆分成两个带头结点的单链表L1和L2,其中L1=(a1,a2,a3...an),L2=(b1,b2,b3....bn),要求L1使用L的头结点。

解题思路:

利用原单链表L中的所有节点通过改变指针域重组成两个单链表L1和L2,由于L1中节点的相对顺序与L中的相同,所以采用尾插法建立单链表L1,由于L2中节点的相对顺序与L中的相反,所以采用头插法建立单链表L2。

解题要点:

该题考察单链表的基本操作,灵活运用并掌握单链表的基本运算。

C++代码实现:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef struct LNode
{
    int data;
    struct LNode *next;
}LinkNode;
void split(LinkNode *&L,LinkNode *&L1,LinkNode *&L2)    //  主要运算
{
    LinkNode * p=L->next,*q,*r1;
    L1=L;
    r1=L1;
    L2=(LinkNode *)malloc(sizeof(LinkNode));     //   初始化
    L2->next=NULL;
    while(p!=NULL)
    {
        r1->next=p;
        r1=p;
        p=p->next;
        q=p->next;
        p->next=L2->next;
        L2->next=p;
        p=q;
    }
    r1->next=NULL;
}
/*void CreateListF(LinkNode *&L,int a[],int n)  // 头插法
{
    LinkNode *s;
    L=(LinkNode *)malloc(sizeof(LinkNode));
    L->next=NULL;
    for(int i=0;i<n;i++)
    {
        s=(LinkNode *)malloc(sizeof(LinkNode));
        s->data=a[i];
        s->next=L->next;
        L->next=s;
    }
}*/
void CreateListR(LinkNode *&L,int a[],int n)       // 尾插法
{
    LinkNode *s,*r;
    L=(LinkNode *)malloc(sizeof(LinkNode));
    r=L;
    for(int i=0;i<n;i++)
    {
        s=(LinkNode *)malloc(sizeof(LinkNode));
        s->data=a[i];
        r->next=s;
        r=s;
    }
    r->next=NULL;
}
void DispList(LinkNode *L)      //  输出函数
{
    LinkNode *p=L->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}
int main()
{
    int a[100],n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    LinkNode *L,*L1,*L2;
    //CreateListF(L,a,n);   // 头插法
    CreateListR(L,a,n);     // 尾插法
    split(L,L1,L2);
    DispList(L1);       //   输出L1
    DispList(L2);    //   输出 L2
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/DreamTrue1101/article/details/82969335