循环单链表 | 循环删除表中所有最小值并输出

Posted TQCAI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环单链表 | 循环删除表中所有最小值并输出相关的知识,希望对你有一定的参考价值。

王道P38T19

代码:

void del_min(LinkList& L){
    LNode*p=L,*mp=L;
    while(p->next!=p){
        if(p->next==L){    //进行了一轮 
            LNode*del=mp->next;
            mp->next=del->next;
            printf("%d ",del->data);
            p=p->next;    //跳过头结点 (这个语句放在删除语句之前) 
            delete del;
            mp=L; 
            continue;  //注意用这句话跳过下面的语句
        }
        if(p->next==p) break;
        if(p->next->data < mp->next->data){
            mp=p;
        }
        p=p->next;
    }
    delete p;
}

完整代码:

技术分享图片
#include <cstdio>
#include <stdlib.h>

using namespace std;

typedef struct LNode{
    int data;
    struct LNode* next=NULL; 
    LNode(int x=0){    
        data=x;
    }
}LNode;

typedef LNode* LinkList;

LinkList  build_list(int * arr,int n){
    int i;
    LinkList L=new LNode;
    LinkList pre=L,p;
    for(i=0;i<n;i++){
        p=new LNode(arr[i]);
        pre->next=p;
        pre=p;
    }
    p->next=L;
    return L;
}

void show_list(LinkList& L){
    LinkList p=L->next;
    while(p!=L){
        printf("%d ",p->data);
        p=p->next;
    }
    puts("");
}

void append(LinkList& L,int d){
    LNode* p=new LNode(d),*end=L;
    while(end->next!=L) end=end->next;
    end->next=p;
    p->next=L;
}

void insert(LinkList& L,int i,int d){
    LNode* p=L,*n=new LNode(d);
    for(int j=0;j<i && p->next!=L;j++) 
        p=p->next;
    n->next=p->next;
    p->next=n;
} 

void del_min(LinkList& L){
    LNode*p=L,*mp=L;
    while(p->next!=p){
        if(p->next==L){    //进行了一轮 
            LNode*del=mp->next;
            mp->next=del->next;
            printf("%d ",del->data);
            p=p->next;    //跳过头结点 (这个语句放在删除语句之前) 
            delete del;
            mp=L; 
            continue;
        }
        if(p->next==p) break;
        if(p->next->data < mp->next->data){
            mp=p;
        }
        p=p->next;
    }
    delete p;
}

int main(){
    const int n=6;
    int A_arr[n]={1,2,3,4,2,0};
    LinkList A=build_list(A_arr,n);
    show_list(A);
    del_min(A);
}
 
View Code

注意:

(1)红色代码:注意工作指针p初始化

(2)粉色代码:注意指针滑动要在delete之前进行,不然在最小值在链表末尾的情况下会吧p的后继删除掉,导致空指针错误

(3)橙色代码:mp最小值前驱指针初始化

(4)continue加粗代码:注意加上continue在遍历一轮后跳过后面的语句

 

以上是关于循环单链表 | 循环删除表中所有最小值并输出的主要内容,如果未能解决你的问题,请参考以下文章

删除单链表中的循环[重复]

数据结构不带头结点非循环的单链表

算法专区博文汇总

不带头结点的单链表L,设计一个递归算法逆序输出所有结点值

线性表练习之Example002-删除递增非空单链表中的重复值域节点

检测单链表中循环的开始?