⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 singlylinkedlist.h

📁 回顾基础
💻 H
📖 第 1 页 / 共 2 页
字号:
        while (p!=NULL)  
        {
            rear->next = new Node<T>(p->data);   //创建结点链入rear结点之后
            p = p->next;
            rear = rear->next;                   //rear指向新的链尾结点
        }
    }
}

template <class T>
bool SinglyLinkedList<T>::equals(SinglyLinkedList<T> &list)   //比较两条单链表是否相等
{
    Node<T> *p=this->head, *q=list.head;
    while (p!=NULL && q!=NULL && p->data==q->data)
    {
        p = p->next;
        q = q->next;
    }
    return (p==NULL && q==NULL);
}


//以下是第4章例题,递归算法
/*
template <class T>
SinglyLinkedList<T>::SinglyLinkedList(T value[], int n)    //构造由指定数组提供元素的单链表
{
    head = create(value,n,0);
}

template <class T>
Node<T>* SinglyLinkedList<T>::create(T value[], int n, int i)    //由指定数组构造单链表,递归算法
{
    Node<T> *p=NULL;
    if (i<n)
    {
        p = new Node<T>(value[i]);
        p->next = create(value, n, i+1);         //递归调用         
    }
    return p;
}

template <class T>
int SinglyLinkedList<T>::length()                //返回单链表长度
{
    return lengthFrom(head);
}

template <class T>
int SinglyLinkedList<T>::lengthFrom(Node<T>*p)   //返回从p结点开始的单链表长度,递归算法,私有函数
{
    if (p==NULL)
        return 0;
    return 1+lengthFrom(p->next);                //递归调用
}

template <class T>
void SinglyLinkedList<T>::print()                //输出单链表
{
    cout<<"(";
    printFrom(head);
    cout<<")\n";
}

template <class T>
void SinglyLinkedList<T>::printFrom(Node<T>*p)   //输出从p结点开始的单链表,递归算法,私有函数
{
    if (p!=NULL)
    {
        cout<<p->data;
        if (p->next!=NULL)
            cout<<", ";
        printFrom(p->next);                      //递归调用
    }
}
*/
//以下是第4章习题,递归算法
/*
template <class T>
SinglyLinkedList<T>::SinglyLinkedList(SinglyLinkedList<T> &list)   //以单链表list构造新的单链表,复制单链表
{
    this->head = copy(list.head);
}

template <class T>
Node<T>* SinglyLinkedList<T>::copy(Node<T> *p)   //复制单链表,递归算法,私有函数
{
    Node<T> *q=NULL;
    if (p!=NULL)
    {
        q = new Node<T>(p->data);
        q->next = copy(p->next); 
    }
    return q;
}
   
template <class T>
bool SinglyLinkedList<T>::equals(SinglyLinkedList<T> &list)   //比较两条单链表是否相等
{
    return equals(this->head, list.head);
}

template <class T>
bool SinglyLinkedList<T>::equals(Node<T> *p, Node<T> *q)   //比较两条单链表是否相等,递归算法,私有函数
{
    if (p==NULL && q==NULL)
        return true;
    if (p!=NULL && q!=NULL)
        return p->data==q->data && equals(p->next, q->next);
    return false;
}
*/





//以下第8章 8.2.1 顺序查找,散列表中用

template <class T>
Node<T>* SinglyLinkedList<T>::search(T value, Node<T>* start)    //从单链表start结点开始顺序查找指定元素
{                                                 //若查找成功返回结点,否则返回NULL
    if (isEmpty())
        return NULL;

    Node<T>* p=start;
    while (p!=NULL && p->data!=value)
        p = p->next;
    return p;
}

template <class T>
Node<T>* SinglyLinkedList<T>::search(T value)    //顺序查找指定元素
{
    return search(value, head); 
}

template <class T>
bool SinglyLinkedList<T>::contain(T value)       //以查找结果判断单链表是否包含指定元素
{
    return search(value)!=NULL;
}

template <class T>
bool SinglyLinkedList<T>::remove(T value)        //移去指定元素首次出现结点
{
    if (isEmpty())
        return false;
    
    Node<T> *p=head;
    if (head->data==value)
    {
        head = head->next;                       //头删除
        delete(p);
        return true;
    }
    
    Node<T>* front=head;
    p=front->next;
    while (p!=NULL && p->data!=value)            //中间/尾删除
    {
        front = p;
        p=p->next;
    }
    if (p!=NULL)
    {
        front->next = p->next;
        delete(p);
        return true;
    }
    return false;
}

/*
//以下是第2章习题
    public boolean replace(Object obj, E value)//将元素值为obj的结点值替换为value,O(n)
    {                                            //若替换成功返回true,否则返回false
        if (obj==null || value==null)
            return false;

        Node<E> p=this.head;
        while (p!=null)
        {
            if (obj.equals(p.data))
            {
                p.data = value;
                return true;
            }
            p = p.next;
        }
        return false;
    }
 
    public boolean replaceAll(Object obj, E value) //将所有元素值为obj的结点值替换为value,O(n)
    {                                            //若替换成功返回true,否则返回false
        boolean done=false;
        if (obj!=null && value!=null)
        {
            Node<E> p=this.head;
            while (p!=null)
            {
                if (obj.equals(p.data))
                {
                    p.data = value;
                    done = true;
                }
                p = p.next;
            }
        }
        return done;
    }
    
    public boolean removeAll(Object obj)         //将所有元素值为obj的结点删除
    {
        if (this.head==null || obj==null)
            return false;
        
        boolean done=false;
        while (this.head!=null && obj.equals(this.head.data))
        {
            this.head = this.head.next;          //头删除
            done = true;
        }
        Node<E> front=this.head, p=front.next;
        while(p!=null)
        {
            if (obj.equals(p.data))
            {
                front.next = p.next;             //删除p结点
                p = front.next;
                done = true;
            }
            else
            {
                front = p;
                p = p.next;
            }
        }
        return done;
    }


/* 第2章    //可行,但效率低,时间复杂度是O(n*n)。
    public String toString()
    {
        String str="{";
        if (this.length()!=0)
        {
            for(int i=0; i<this.length()-1; i++)
                str += this.get(i).toString()+", ";
            str += this.get(this.length()-1).toString();
        }
        return str+"}";
    }
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -