算法-链表 在带头结点的单链表L中,删除所有值为X的结点,并释放其空间。

在带头结点的单链表L中,删除所有值为X的结点,并释放其空间,假设值为X的结点不唯一

//方法一:从头到尾扫描单链表
void delete(LinkList &L,Elemtype x)
{
    //判断
    //实现过程
    LinkNode *p=L->next;
    LinkNode *pre=L;
    LinkNode *q;
    //前驱结点和当前结点一起出发
    while(p)
    {
        if(p->data==x)
        {
            q=p;
            p=p->next;
            pre->next=p;
            free(q);
        }
        else
        {
            pre=p;
            p=p->next;
        }
    }
}
//方法二采用尾插法建立单链表
void delete(LinkList &L,ElemType x)
{
    //我没看答案,我感觉这个题目的思想应该是这样的,和上面那个题类似,就是利用链表的这种特性来实现对同一个链表同时的插入与扫描
    LinkNode *p=L->next,*r;
    r=L;//最开始的时候r是L的头指针
    while(p!=null)
    {
        if(p->data!=x)
        {
            r->next=p;//建立连接
            r=p;//r指针划向尾端
            p=p->next;
           //也就是说吧r是新链表的尾指针,但是它同时也是p的前一个指针
        }
        else
        {
            q=p;
            p=p->next;
            free(q);//释放掉
        }
    }
    //循环结束表示已经全部扫描完了。
    r->next=null;//插入结束后置未结点指针为null
}
上一篇:队列(链式)


下一篇:求助:单链表合并指针问题