zoukankan      html  css  js  c++  java
  • 链表-(qb讲课)

    #include<iostream>
    using namespace std;
    void printList(ListNode *head)
    {
        ListNode *p=head;
        while(p != NULL)
        {
            cout << p->num << endl;
            p = p->next;
        }
    }
    int printList(ListNode *head)
    {
        ListNode *p=head;
        int k = 0;
        while(p)//指导谁操作谁时,是p
        {
            k++;
            p = p->next;
        }
        return k;
    }
    ListNode *Locate(ListNode *head, int num)
    {
        ListNode *p = head;
        while(p)
        {
            if(p->num == num)
                break;
            p = p->next;
        }
        return p;
    }
    ListNode *createByTail()
    {
        ListNode *head = NULL;
        ListNode *p1, *p2;
        int n = 0, num;
        while(cin >> num)
        {
            if(!num) break;
            p1 = new ListNode;//合并了操作
            p1->num = num;
            n = n+1;
            if(n == 1)
                head = p1;
            else
                p2->next = p1;
            p2 = p1;//合并了操作
        }
        while(head) //表里面要有东西才能这么写
            p2->next = NULL;
        return head;
    }
    ListNode *insertNode(ListNode *head, ListNode *p, ListNode *s)
    {
        ListNode *q;
        if(p == head)
        {
            s->next = head;
            head = s;
        }
        else
        {
            q = head;
            while(q->next != p)
                q = q->next;
            s->next = p;
            q->next = s;
        }
        return head;
    }
    ListNode *insertNodeInOrder(ListNode *head, ListNode *s)
    {
        ListNode *p1, *p2;
        if(head == NULL)
        {
            s->next = NULL;
            head = s;
        }
        else
        {
            p1 = head;
            while((s->num > p1->num) && (p1->next != NULL))
            {
                p2 = p1;
                p1 = p1->next;
            }
            if(s->num <= p1->num)
            {
                if(head == p1)
                    head = s;
                else
                    p2->next = s;
                s->next = p1;
            }
            else
            {
                p1->next = s;
                s->next = NULL;
            }
        }
    }
    ListNode *insertNodeInOrder(ListNode *head, ListNode *s)
    {
        ListNode *p1, *p2;
        if(head == NULL)
        {
            head = s;
            s->next = NULL;
        }
        else
        {
            
        }
    }
    ListNode *deleteNude(ListNode *head, int num)
    {
        ListNode *p1, *p2;
        if(head == NULL)
        {
            cout << "NULL list";
            return head;
        }
        p1 = head;
        while(num != p1->num && p1->next != NULL)
        {
            p2 = p1;
            p1 = p1->next;
        }
        if(num == p1->num)
        {
            if(p1 == head) head = p1->next;
            else p2->next = p1->next;
        }
        else cout <<"Not found"<<end;
        return head;
    }
    int main()
    {
        
    }
    
    Code            
    #include<iostream>
    using namespace std;
    struct ListNode
    {
        int num;
        ListNode *next;
    };
    ListNode *createByTail()
    {
        ListNode *head, *p1, *p2;
        head = new ListNode;
        head->p = NULL;
        p2 = head;
        int num;
        while(cin >> num)
        {
            p1 = new ListNode;
            p1->num = num;
            p2->next = p1;
            p2 = p1;
        }
        p2->next = NULL;
        return head;
    }
    void InsertNode(ListNode *head, ListNode *p, ListNode *s)
    {
        ListNode *q;
        q = head;
        while(q->next && q->next != p)//只用q->next就可以访问完所有的结点,太美妙了!!!!
            q = q->next;
        if(q->next == p)
        {
            q->next = s;
            s->next = p;
        }
        else cout <<"invaled"<<endl;
        return head;
    }
    void DeleteNode(ListNode *head, ListNode *p)//直接按照p判断的不需要判断是否为空列表
    {
        ListNode *q;
        q = head;
        while(q->next && q->next != p)
            q = q->next;
        if(q->next = p)
        {
            q->next = p->next;
            delete p;
        }
    }
    void DeleteNode(ListNode *head, int num)//需要琢磨
    //直接按照num判断的需要判断是否为空列表
    {
        ListNode *p1, *p2;
        if(head->next == NULL)//访问前必须判断一下有无
        {
            cout <<"NULL list";
            return ;
        }
        p2 = head;
        p1 = head->next;
        while(num != p1->num && p1->next != NULL)//p1已经是最后一个元素了,连最后一个元素都不是,那就找不到了
        {
            p2 = p1;
            p1 = p1->next;
        }
        if(num == p1->num)
        {
            p2->next = p1->next;
            delete p1;
        }
        else cout <<"not found!"<<endl;
    }
    void ReverseList(ListNode *head)//需要琢磨
    {
        ListNode *p, *s;
        p = head->next;
        head->next = NULL;
        while(p)//p==NULL,说明s是最后一个元素,那么把最后一个元素上上去了就行了
        {
            s = p;
            p = p->next;
            s->next = head->next;
            head->next = s;
        }
    }
    int main()
    {
    
    }
    有头节点
    void InsertNode(ListNode *head, ListNode *p, ListNode *s)
    {
        ListNode *q2, q1;
        q2 = head;
        while(q2->next)//q2是前一个结点,q1才是正确的结点
        {
            //访问当前点
            q1 = q2->next;
            if(q1就是要找的点) break;
            //进入到下一阶段
            q2 = q2->next;
        }
        if(q2->next)//没找完就退出了,肯定是找到了
        {
            //还是要把当前的点找到
            q1 = q2->next;
            q2->next = q1->next;
            delete q1;
        }
        else cout <<"invaled"<<endl;
        return head;
    }
    访问一个结点

    注:单次操作时不要循环里面操作,因为有可能没找到啥的,要到最后来判断找到了没

    但是,删除操作是特殊的,如果在的访问的过程中就删除,那么如果删除了就不p2=p2->next,因为以访问每一个节点为目的,删除过后自动更新了当前结点

    这种更新方式(在线删除)要和单个删除(非实时)分开

    ListNode *mergeList(ListNode *ha, ListNode *hb)
    {
        ListNode *pa2, *pa1, *pb2, *pb1, *s;
        pa2 = ha;
        while(pa2->next)
        {
            int flag = 0;
            pa1 = pa2->next;
            //cout << (pa1->id)<<"next:"<<(pa1->next->id)<<endl;
            pb2 = hb;
            while(pb2->next)
            {
                pb1 = pb2->next;
                if(pb1->id == pa1->id)
                {
                    flag = 1;
                    break;
                }
                pb2 = pb2->next;
            }
            if(!flag)
            {
                pa2->next = pa1->next;
                delete pa1;
            }
            else pa2 = pa2->next;//这里加个else就是因为删除了结点就不需要手动更新结点了
        }
        return ha;
    }
    在线删除结点

    链表的数量大小是内存决定的(数组大了会崩溃)

    ListNode **表示的是指针的指针,(例如&head)

    写链表用Microsoft visual c++调试比较好

    链表还是要考虑空链表,头,中间,尾部

  • 相关阅读:
    tabbar 旋转指定的页面
    GDAL中文路径不能打开&Shp文件字段属性值中文乱码
    Project : error PRJ0019: 工具从"Moc'ing xxx.h..."
    详解Android中的屏幕方向
    qt中获取文件路径和文件名
    vs2005下Qt项目中修改exe图标的方法
    Qt & C/C++统计运行时间
    Qt 中Treewidget添加右键菜单
    QT 中文乱码解决方案
    Qt多线程应用QRunnable显示进度条示例
  • 原文地址:https://www.cnblogs.com/bear-xin/p/14520783.html
Copyright © 2011-2022 走看看