链表-(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++调试比较好

 

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

posted @ 2021-03-11 21:43  bear_xin  阅读(85)  评论(0)    收藏  举报