zoukankan      html  css  js  c++  java
  • 链表的基本用法

    链表概念的引入

    struct ListNode
    {
        int num;
        ListNode* next;
    };

    创建无序链表,依次输入各节点数据,以-1结束。循环读入数据,若数据不为-1,就申请一个新节点,将数据赋给新节点,在链表尾部加上该节点。加节点的时候,要分情况,(1)首节点(2)中间节点*(3)尾节点

    ListNode* Creat()
    {
        ListNode *p1,*p2,*head;
        int a;
        head =NULL;
        cin>>a;
        while(a!=-1)
        {
            p1=new ListNode;
            p1->num = a;
            if(head==NULL)
            {
                head =p2=p1;
            }
            else
            {
                p2->next=p1;
                p2=p1;
            }
            cin>>a;
        }
        if(head!=NULL)
            p2->next=NULL;
        return head;
    }

    输出链表,函数通过头结点传参,这里要注意尽量使用const修饰,避免函数修改节点数据

    void print(const ListNode* head)
    {
        const ListNode *p;
        p=head;
        while(p!=NULL)
        {
            cout << setw(4)<<p->num;
            p=p->next;
        }
        cout<<endl;
    }

    查找特定节点,在链表中查找数据值为x的节点,并返回该节点的指针,这里也使用const修饰参数

    const ListNode* Search(const ListNode* head,int x)
    {
        const ListNode* p;
        p=head;
        while(p!=NULL)
        {
            if(p->num == x)
                return p;
            p=p->next;
        }
        return NULL;
    }

    删除一个节点,比如值等于x的节点,下面的程序只删除第一个值为x的节点,在删除过程中,也要分情况,(1)如果是空链表,就直接返回NULL(2)如果删除的节点刚好是头结点,那么将下一个节点设为头结点(3)如果是其他节点,就正常删除。删除过程也是从头结点遍历,这里用两个指针,一个用来遍历,一个用来保存前一个节点,这样删除的时候,可以用前一个节点的next指向该节点后面的节点。

    ListNode* Delete_one_node(ListNode* head,int x)
    {
        ListNode *p1,*p2;
        if(head == NULL)
        {
            cout<<"the list is null"<<endl;
            return NULL;
        }
        p1=head;
        while(p1->num!=x && p1->next!= NULL)
        {
            p2=p1;
            p1=p1->next;
        }
        if(p1->num == x)
        {
            if(p1==head)
                head=p1->next;
            else
                p2->next=p1->next;
            delete p1;
            cout<<"delete finished"<<endl;
        }
        else
            cout<<"sorry,dont find the node x"<<endl;
        return head;
    }

    释放链表,也是传参链表的头结点,这里同样借助一个指针来逐个释放节点,从头结点开始,把头结点赋给新节点,每次将头结点往后移一位,删除节点,相当于删除了原来的头结点

    void Delete_all(ListNode* head)
    {
        ListNode *p;
        while(head)
        {
            p=head;
            head = head->next;
            delete p;
        }
    }

    插入一个节点,这个函数的前提是,在函数执行前,已建立了一个节点值为升序的链表,插入一个新节点之后,链表依然保证升序。插入时,也要考虑多种情况,(1)链表是空链表,直接将新节点作为头结点(2)插入在头结点之前,这里依然用两个节点,一个p1从头结点开始判断遍历,一个p2永远指向p1之前,插入在头结点之前,直接将新节点作为头结点(3)插入在链表中间(也是p1节点之前),直接将p2的next指向新节点(4)插入在尾节点之后,要注意要把新节点的next赋成NULL

    ListNode* Insert(ListNode* head,ListNode *p)
    {
        ListNode *p1,*p2;
        if(head==NULL)
        {
            head=p;
            p->next=NULL;
            return head;
        }
        p1=head;
        while(p->num>p1->num && p1->next !=NULL)
        {
            p2=p1;
            p1=p1->next;
        }
        if(p->num <= p1->num)
        {
            p->next=p1;
            if(head==p1)
                head=p;
            else
                p2->next = p;
        }
        else
        {
            p1->next=p;
            p->next=NULL;
        }
        return head;
    }
  • 相关阅读:
    ES6 函数——箭头函数
    ES6 变量var、let和const
    vue项目可视化管理之(vue ui)
    记录一次并发测试的bug
    python接口自动化读取json、yaml、ini文件
    python接口自动化学习笔记(封装方法用于读取excel)
    python 数据驱动(ddt,unpack)
    Python 做Django 项目遇到问题:Not Found: /c_hello(或/c_webskt/)
    下载安装破解PyCharm(转载)
    Selenium 八种元素定位方法
  • 原文地址:https://www.cnblogs.com/mini-coconut/p/8971967.html
Copyright © 2011-2022 走看看