Day25 算法题-37题:删除单链表重复值、38题:判断双链表对称

42 阅读2分钟

题目描述:

37题:递增的单链表,去掉表中重复的元素,只保留一个数值

38题:判断带头结点的双循环链表是否对称

思路:

37题:用一个变量val存入当前节点的值,向后遍历,因为为递增的链表,则重复值都相连。若遍历到的相同元素结点则删除,遍历到不同值就更新变量,每次删除结点后,长度减一;

38题:定义双指针,一个从头向后遍历链表,一个从尾部向前遍历,每次对比其中元素,不同则返回错误,相同继续遍历,直到两指针相遇或者p走到了q的后面(也是q走到了p的前面),此时返回true

具体实现:

//37题、递增的单链表,去掉表中重复的元素,只保留一个数值(带头结点)
void DeletRepetiElem(SqList &L , int &len)
{
    if(len <=1 )    return;  //当链表只有一个结点时,无重复值,直接返回
    ListNode* p = L->next->next; //从第二个结点开始遍历
    int val = L->next->data;//val用于记录当前值作比较以找出重复值,将第一个节点值赋予val
    for (int i=1 ; i<len && p!=NULL ; i++)
    {
        if(p->data == val){//如果节点值和之前值一样的话就删除结点
            ListDelet(p); //删除p结点且令p指向下一结点
            len--;}
        else {
            val = p->data;
            p = p->next;} //否则将val的值更新为p结点值,p结点指向下一个
    }
    return;
}
//38题、判断带头结点的双循环链表是否对称
bool SemmetryList(DLinkList L)
{
    //定义双指针相向遍历链表
    DNode* p = L->next;         //p指针从头 向后遍历
    DNode* q = L->prior;        //q指针从尾 向前遍历
    while(p!=q && p->prior!=q)  //pq相遇 或者q走到了p的前面,循环结束
    {
        if(p->data == q->data)
            return false;       //若不相等,则返回错误
        p=p->next;
        q=q->prior;
    }
    return true;
}
小结:

这次没写主函数,