描述
利用单链表表示一个递增的整数序列,删除链表中值大于等于mink且小于等于maxk的所有元素(mink和maxk是给定的两个参数,其值可以和表中的元素相同,也可以不同)。
输入
多组数据,每组数据有两行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔),第三行为给定的mink和maxk(用空格分隔)。当n=0时输入结束。
输出
对于每组数据分别输出一行,依次输出删除元素后的链表元素,元素之间用空格分隔。
样例输入1 复制
5
1 2 3 4 5
2 4
6
2 4 6 8 10 12
3 5
0
样例输出1
1 5
2 6 8 10 12
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| #include<iostream> #define OK 1 using namespace std; typedef struct LNode { int data; struct LNode *next; }LNode,*LinkList; bool InintList(LinkList &L) { L=new LNode; L->next=NULL; return OK; } /* void DeleteMinMax(LinkList &L,int mink,int maxk) //自己的解法,没有老师的简便和合理 { LNode *p=L->next; LNode *t1=L,*t2=L->next;//暂时记录位置的指针 ,这个一定要注意初始化,不然可能会造成空指针,由于第一个节点可能被删除 LNode *t;//暂时记录位置 while(p->data<mink) { t1=p; p=p->next; } while(p) //比较关键的一步 { if(p->data<=maxk) t2=p; p=p->next; } t1->next=t2->next; //连接 p=t1->next; while(p!=(t2->next)) //关键步骤 { t=p; p=p->next; delete t; } }*/ void DeleteMinMax(LinkList &L,int mink,int maxk)//官方解法 { LNode *pre=L; // LNode *p=L->next; LNode *q,*s;//暂时指针 while(p&&p->data<mink) { pre=p; p=p->next; } while(p&&p->data<=maxk) { p=p->next; } q=pre->next; pre->next=p;//连接完成,接下来是delete。 while(q!=p) { s=q; q=q->next; delete s; } } int main() { int num; while(cin>>num&&num!=0) { LinkList L; InintList(L); LNode *p; LNode *r; r=L; for(int i=1;i<=num;i++) { p=new LNode; cin>>p->data; p->next=NULL; r->next=p; r=p; } int mink,maxk; cin>>mink>>maxk; DeleteMinMax(L,mink,maxk); p=L->next; cout<<p->data; p=p->next; while(p) { cout<<" "<<p->data; p=p->next; } cout<<endl; } return 0; }
|