无头结点单链表的逆置_无头节点的链表.PPT

无头节点的链表.PPT

链表的排序(按照升序排列) 不同于数组,链表的排序不用改变每个节点里面的值,只需要改变节点和节点之间的连接关系。 思路1,类似选择排序,每次找出最小的,脱离原链表,插入在另一个新链表的末尾: 先把原链表中最小的元素所在的那个节点找出来,删除其在原链表的位置,自己作为新链表的第一个节点 然后在原链表中依次找到最小的那个节点,在原链表中删除,插入新链表中,插入的位置在新链表上次插入的那个节点之后。 思路2,类似冒泡排序 如果相邻元素无序,则交换,注意现在链表中交换是要改变节点的连接关系,而不是改变节点。 相邻元素交换应该为先执行删除操作,再执行插入操作 排序步骤的图示(有头节点的情况) 排序步骤的图示(有头节点的情况) void sort(struct Node **h) { struct Node *p,*h1,*q,*pmin,*pminpre,*newp; h1=(struct Node*)malloc(sizeof(struct Node));//新的头节点 newp=h1; while((*h)->next!=NULL) {//当老链表没有元素节点的时候才完毕 pmin=(*h)->next; pminpre=*h; q=pmin; p=pminpre; while(q->next!=NULL){//当老链表遍历一趟完毕,找到这一趟的最小值 q=q->next; p=p->next; if(q->datadata) { pmin=q; pminpre=p; } } pminpre->next=pmin->next;//原链表中删除节点pmin newp->next=pmin;//新链表的末尾增加节点pmin newp=pmin; newp->next=NULL; } *h=h1; //老的头节点赋值为新的头节点, 想一想为什么形参要定义为Node**h 而不Node *h } 链表的排序 上述是对有头节点的链表排序 对于仅有头指针的链表(无头节点的链表)排序要稍微复杂一些,这是由于仅有头指针链表删除一个节点的时候,要区分是不是第一个节点,是第一个节点的话要修改头指针。 单链表的逆置 将一个链表逆置 思路:将原链表元素按照顺序取出来(删除和原链表脱离的关系,但并不删除节点),然后插入在新链表的第一个元素的位置上。 对于仅有头指针和有头节点两种情况程序会有些差别: 1、有头节点的时候,每次在头节点后执行插入操作即可。 2、仅有头指针的时候,每次在头指针前面插入元素,然后更新头指针。 将一个链表逆置图示(有头节点的情况) 将一个链表逆置代码(有头节点的情况) reverse(struct Node **head) { struct Node *p,*newhead,*p1; p=(*head)->next; newhead=*head; newhead->next=NULL; while( p != NULL) { p1=p; //p1为每次取出的节点 p=p->next;//读取下一个节点 p1->next=newhead->next;//插入在新链表的表头的前面 newhead->next=p1; } *head=newhead; //将新的表头赋值给形参的表头 } 将一个链表逆置(仅有头指针的情况) 思路:将原链表第一个元素取出来(删除和原链表脱离的关系,但并不删除节点),然后作为新链表的表头节点,用一个新的头指针指向它。 然后按照顺序将原链表的每个节点取出,插入在新链表头节点的前面,同时更新新链表的头节点指针指向的位置(即执行在链表的表头插入一个元素) reverse(struct Node **head) { struct Node *p,*newhead,*p1; p=*head; newhead=NULL; while( p!=NULL) { p1=p; //p1为每次取出的节点 p=p->next;//读取下一个节点 p1->next=newhead;//插入在新链表的表头的前面 newhead=p1; //更新新链表的表头位置 } *head=newhead; //将新的表头赋值给形参的表头 } 将一个链表逆置过程的图示(只有头指针情况) 两个有序单链表的合并

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值