链表基础题

这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

2.删除所有值为x的节点(没要求递归)

思路:创建一个p和pre指针,一个指向当前节点,一个指向前一个节点

如果遇到相同,那么就"跨越"这个节点

图片.png

3.反向输出链表

思路:一直递归到最后,从而输出从里层往外输出

图片.png

4.删除链表中最小元素

##思路:维护最小值指针和他的前驱指针,遍历记录最小值,最后删除

void DeleMin(LinkList &L){
    
    LNode *pre=L,*p=pre->next;
    LNode *minpre=pre,*minp=p;      //记录最小值得节点以及他的前驱

    while(p != NULL){       
        if(p->data < minpre->data){     //后一个比前一个小
            min = p;            //维护min处于最小节点位置
            minpre = pre;       //维护minpre处于最小节点的前驱
        }
        p = p->next;        //大步往前走
        pre = pre->next;    //大步往前走
    }
    minpre->next = min->next;    //删除最小值
    free(minp);
    return L;
}
复制代码

5.链表就地反转

思路:维护两个指针,cur和pre,让pre永远在cur的前方

ListNode reverseList(ListNode head) {
        ListNode *pre = NULL, *cur = head;
        while (cur != NULL) {
            ListNode *t = cur->next;         //再存cur的下一个指针          
            cur->next = pre;                  //cur指向pre
            pre = cur;                        //cur往前走一步
            cur = t;                        //pre往前走一步
        }
        return pre;
    }
    
复制代码

6.重排链表,使其变成递增序列

思路:使用插入排序每次遍历到的节点,插入到前面的有序表中

void Sort(LinkList &L){
        LNode *p = L->next;
        LNode *r = p->next;     //保存p的后继,防止断链
        LNode *pre;
        p->next = NULL;     //构造第一个有序表
        p = r;
 
        while(p != NULL){
            r = p->next;
            pre = L;
            while(pre->next != NULL && pre->next->data < p->data){
                pre = pre->next;        //pre往前走,寻找插入p的前驱结点
            }
            p->next = pre->next;    //将*p插入到*pre之后
            pre->next = p;
            p = r;
        }
    }
复制代码

Guess you like

Origin juejin.im/post/7034671480839340039