zoukankan      html  css  js  c++  java
  • 单链表常见操作

    #include <stdio.h>
    #include <stdlib.h>

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

    //头插法实现单链表
    Lnode* createLinkListByHead(int a[],int n)
    {
        Lnode* head=(Lnode*)malloc(sizeof(Lnode));
        head->next=NULL;
        int i=0;
        for(i=0;i<n;i++)
        {
            Lnode* node=(Lnode*)malloc(sizeof(Lnode));
            node->data=a[i];
            node->next=head->next;
            head->next=node;
        }
        return head;
    }
    //尾插法实现单链表
    Lnode* createLinkListByTail(int a[],int n)
    {
        Lnode *head=(Lnode*)malloc(sizeof(Lnode));
        head->next=NULL;
        int i=0;
        Lnode *p=head;
        for(i=0;i<n;i++)
        {
            Lnode* node=(Lnode*)malloc(sizeof(Lnode));
            node->data=a[i];
            p->next=node;
            p=node;
        }
        p->next=NULL;
        return head;
    }
    //初步实现
    Lnode* swapLinklist(Lnode *head)
    {
        if(head==NULL || head->next==NULL)
            return head;
        Lnode *p=head;
        Lnode *pp=head->next;
        Lnode *pNext=NULL;
        Lnode *pre=NULL;
        while(pp!=NULL)
        {
            p->next=pp;
            pNext=pp->next;
            pp->next=pre;
            pre=pp;
            pp=pNext;
        }
        return p;
    }

    //上面方法的简单优化
    Lnode* swapListLink(Lnode *head)
    {
        if(head==NULL || head->next==NULL)
        {
            return head;
        }
        Lnode *p=head->next;
        Lnode *pNext=NULL;
        Lnode *pre=NULL;
        while(p!=NULL)
        {
            head->next=p;
            pNext=p->next;
            p->next=pre;
            pre=p;
            p=pNext;
        }
        return head;
    }


    //进一步优化
    Lnode* swapList(Lnode *head)
    {
        if(head==NULL || head->next==NULL)
            return head;
        Lnode *p=head->next;
        Lnode *pNext=NULL;
        head->next=NULL;
        while(p!=NULL)
        {
            pNext=p->next;
            p->next=head->next;
            head->next=p;
            p=pNext;
        }
        return head;
    }

    //链表k翻转,还有一种更方便的方法,就是遍历一遍把值保存在一个数组里面
    //根据规则重新给链表赋值
    void swapListByK(Lnode *head,int k)
    {
        if(head==NULL || head->next==NULL)
        {
            return;
        }
        int i=0;
        Lnode *p=head->next;
        head->next=NULL;
        Lnode *pTail=head,*pHead=NULL,*pNext=NULL;
        while(p!=NULL)
        {
            if(i%k==0)
            {
                pHead=pTail;
                pTail=p;
            }
            pNext=p->next;
            p->next=pHead->next;
            pHead->next=p;
            p=pNext;
            i++;
        }
    }

    //假设两个单链表都没有环
    int isCrossed(Lnode *p,Lnode *q)
    {
        Lnode *pp=p,*qq=q;
        while(pp->next!=NULL)//注意pp->next!=null和pp!=null的区别,两种情况最后的点是不同的
            pp=pp->next;
        while(qq->next!=NULL)
            qq=qq->next;
        if(pp==qq)
            return 1;
        return 0;

    }
    //判断一个单链表是否自身有环
    int isHaveCircle(Lnode *p)
    {
        if(NULL==p || NULL==p->next)
            return 0;
        Lnode *low,*fast;
        low=p,fast=p;
        while(NULL!=fast && NULL!=fast->next)//条件判定的前后顺序很重要
        {
            low=low->next;
            fast=fast->next->next;
            if(low==fast)
                return 1;
        }
        return 0;
    }
    //可能有cycle(但是两个都有单独的环会无限循环)
    int isTwoCrossed(Lnode *p,Lnode *q)
    {
        if(!isHaveCircle(p) && !isHaveCircle(q))
            return isCrossed(p,q);
        if(!isHaveCircle(p) || !isHaveCircle(q))
            return 1;
        Lnode *pp=p,*qq=q;
        while(pp!=NULL && qq!=NULL && pp!=qq)
        {
            pp=pp->next;
            if(qq->next!=NULL)
                qq=qq->next->next;
            else
                qq=qq->next;
        }
        if(qq==pp && qq!=NULL)
            return 1;
        return 0;
    }


    int main()
    {
        int a[6]={1,2,3,4,5,6};
        Lnode *head=createLinkListByHead(a,6);
        Lnode *resultBeforeSwap=head->next;
        while(resultBeforeSwap!=NULL)
        {
            printf("%3d",resultBeforeSwap->data);
            resultBeforeSwap=resultBeforeSwap->next;
        }
        printf(" ");
        swapList(head);
        Lnode* result=head->next;
        while(result!=NULL)
        {
            printf("%3d",result->data);
            result=result->next;
        }
        printf(" ");

        swapListByK(head,3);
        Lnode* result2=head->next;
        while(result2!=NULL)
        {
            printf("%3d",result2->data);
            result2=result2->next;
        }

        return 0;
    }

    还有链表的各种排序补充。。。

    以上是单链表常见的操作,抛砖引玉,未完待续。。。

  • 相关阅读:
    关于cmake、make、make install
    windows开启ip_forwarding功能
    最新devstack安装(ussuri)
    【rabbitmq】之业务封装
    【rabbitmq】之过期和死信队列
    【rabbitmq】之confirm和return机制
    【rabbitmq】之消费端手动ack
    java短网址服务
    详解druid打印SQL日志
    logback配置文件拆分,抽取公共配置
  • 原文地址:https://www.cnblogs.com/nannanITeye/p/3391306.html
Copyright © 2011-2022 走看看