-
2020-09-25 15:55:00
typedef struct LNode { ElemTpye data; struct LNode *next; }LNode,*LinkList; LinkList Del_Com(LinkList &L) { LNode *p,*q,*s; for(p=L->next;p!=NULL;p=p->next) { for(q=p->next,s=p;q!=NULL;q=q->next) { if(q->next->data==p->next->data) { s->next=q->next; free(q); q=s->next; } else { s=q; q=q->next; } } } }
更多相关内容 -
python数据结构:在已有的单链表中,删除所有值为x的元素:
2020-12-22 14:53:27在已有的单链表中,删除所有值为x的元素,代码如下: class Node(object): # 初始化结点 def __init__(self,num): self.num=num self.next=None class SingleLinkedList(object): # 初始化头结点 def __init__... -
设计在单链表中删除值相同的多余结点的算法
2020-04-12 15:01:01这是一道算法题,写算法...这是一个无序的单链表,我们采用一种最笨的办法,先指向首元结点,其元素值为2,再遍历该结点后的所有结点,若有结点元素值与其相同,则删除;全部遍历完成后,我们再指向第二个结点,再进...这是一道算法题,写算法题最恨没有图解,懂的人不需要看你的文章,不懂的你再怎么讲解也没有几张图解来得简单易懂,下面来分析一下这道题。
我暂时还没有更好的解决方案,虽然有一个办法解决,但是时间复杂度有点高,先看看我的思路吧。
这是一个无序的单链表,我们采用一种最笨的办法,先指向首元结点,其元素值为2,再遍历该结点后的所有结点,若有结点元素值与其相同,则删除;全部遍历完成后,我们再指向第二个结点,再进行同样的操作。看图解:
这里有两个指针变量p、q,均指向单链表的首元结点,我们先不移动指针p,而是让指针q去遍历之后的所有结点。
先让指针p指向的结点与后一个结点比较,这里为了操作方便,我们暂且先不移动指针q,而是这样进行比较:p -> data == q -> next -> data
;若不相等,则让q指向下一个结点:p = p->next
;若相等,则应该先保存下一个结点:r = q -> next
,然后让q指针指向下一个结点的下一个结点:q = r -> next
,并释放r指向的结点内存。这样就成功删除了一个与首元结点重复的结点,接下来以同样的方式继续比较,直到整个单链表都遍历完毕,此时单链表中已无与首元结点重复的结点;然后我们就要修改p指针的指向,让其指向首元结点的下一个结点,再让q指向其下一个结点,继续遍历,将单链表中与第二个结点重复的所有结点删除。以此类推,直至指针p也遍历完了整个单链表,则算法结束。
刚才我们已经删除了一个结点,那么接下来p应该指向下一个结点了:
此时让指针p指向的结点与下一个结点的元素值比较,发现不相等,那么让q直接指向下一个结点即可:q = q -> next
。
继续让q指向的结点的下一个结点与p指向的结点的元素值比较,发现不相等,此时继续移动q,移动过后q的指针域为NULL,说明遍历结束,此时应该移动指针p。
通过比较发现,下一个结点的元素值与其相等,接下来就删除下一个结点即可:
此时p的指针域也为NULL,算法结束。代码如下:
LinkList DeleteRepeat(LinkList l){ LinkList p,q,r; p = l->next; while(p != NULL){ q = p; while(q->next != NULL){ if(p->data == q->next->data){ r = q->next; q = r->next; free(r); }else{ q = q->next; } } p = p->next; } return l; }
微信搜索【码视界】或者扫描下方二维码关注我的微信公众号,更多精彩等着你! -
数据结构-单链表按值删除
2017-09-13 17:07:18#include #include #define OK 1 #define ERROR 0 using namespace std; typedef struct LNODE { int data;... struct LNODE *next;... cout链表无元素可以... else cout需要删除数值不存在"; } } return 0; }#include<iostream> #include<stdlib.h> #define OK 1 #define ERROR 0 using namespace std; typedef struct LNODE { int data; struct LNODE *next; }Lnode; Lnode* Input(int n) { Lnode *head,*p,*q; head=p=(Lnode*)malloc(sizeof(Lnode)); p->next=NULL; for(int i=0;i<n;i++) { int data; cin>>data; q=(Lnode*)malloc(sizeof(Lnode)); q->data=data; q->next=p->next; p->next=q; p=q; } return head; } void Showit(Lnode *p) { p=p->next; while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; } int delete_LNode(Lnode *L,int data) { if(L->next==NULL) { cout<<"链表无元素可以删除!"<<endl; return ERROR; } Lnode *cur,*pre; pre=L; cur=L->next; while(cur!=NULL) { if(cur->data==data) { pre->next=cur->next; free(cur); return OK; } pre=cur; cur=cur->next; } return ERROR; } int main() { int n; while(cin>>n) { Lnode *p=Input(n); while(1) { cout<<"输入要删除的数值:"; int data; cin>>data; if(delete_LNode(p,data)) Showit(p); else cout<<"需要删除数值不存在"<<endl; } } return 0; }
-
顺序表的按值删除算法与数据结构_数据结构单链表的逆置算法
2020-07-10 06:44:21顺序表的按值删除(算法与数据结构) 顺序表的按值删除(算法与数据结构) PAGE / NUMPAGES 顺序表的按值删除(算法与数据结构) 顺序表的按值删除 #include<iostream> using namespace std; const int MaxSize=200; class... -
设计在单链表中删除值相同的多余结点算法。
2019-01-15 17:21:29//s指向要删除结点的前驱 for(q=p->next;q!=NULL; ) { if(q->data==p->data) { s->next=q->next; free(q); q=s->next; } else { s=q; q=q->next; } } } } 二...一、具体实现算法如下:
void DeleteSame(Linklist *L) { LNode *p,*q,*s; p = (*L)->next; for(p;p!=NULL;p=p->next) { s=p; //s指向要删除结点的前驱 for(q=p->next;q!=NULL; ) { if(q->data==p->data) { s->next=q->next; free(q); q=s->next; } else { s=q; q=q->next; } } } }
二、实例程序代码如下所示:
#include<stdio.h> #include<stdlib.h> #include<assert.h> #define LEN 10 typedef int Elemtype; typedef struct LNode{ Elemtype data; struct LNode *next; }LNode,*Linklist; void Init_Linklist(Linklist *L) { *L=(Linklist)malloc(sizeof(LNode)); assert(*L != NULL); (*L)->next=NULL; } void Create_Linklist(Linklist *L) { LNode *p,*q; p = *L; for(int i=0;i<LEN;i++) { q=(Linklist)malloc(sizeof(LNode)); assert( q != NULL); scanf("%d",&q->data); p->next=q; p=q; } p->next=NULL; } void DeleteSame(Linklist *L) { LNode *p,*q,*s; p = (*L)->next; for(p;p!=NULL;p=p->next) { s=p; //s指向要删除结点的前驱 for(q=p->next;q!=NULL; ) { if(q->data==p->data) { s->next=q->next; free(q); q=s->next; } else { s=q; q=q->next; } } } } void Print_Linklist(Linklist *L) { LNode *p; p = *L; while(p->next) { p=p->next; printf("%d ",p->data); } printf("\n"); } int main() { Linklist L; Init_Linklist(&L); Create_Linklist(&L); printf("初始化链表为:\n"); Print_Linklist(&L); DeleteSame(&L); printf("删除后链表为:\n"); Print_Linklist(&L); return 0; }
运行截图:
-
在单链表中删除值为x的节点
2021-10-03 14:10:44再带头节点的单链表L中,删除所有值为x的节点,并释放其空间,假设值为x的节点不唯一,试编写算法以实现上述操作。 二、分析 题目非常简单,只要熟悉单链表的基本操作就可以很快解决这个问题。 三、代码 #... -
在单链表中删除指定值的节点-Java:解法一
2022-05-01 23:21:19分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!... * 在单链表中删除指定值的节点。 * * 思路: * 利用栈或其他容器收集节点。 * * @author Created by LiveE -
链表:设计在单链表中删除值相同的多余结点的算法。
2019-10-14 17:58:42//删除相同值的节点 { s -> next = q -> next ; free ( q ) ; q = s -> next ; } else { //p的值和q的值不相同时的执行步骤 s = q ; q = q -> next ; } } } LNode * ... -
在单链表中删除指定值的节点。
2022-03-23 12:12:51在单链表中删除指定值的节点。 题目:给定一个链表的头节点head和一个整数num,请实现函数将值为num的节点全部删除。 例如1->2->3->4->4->null,输出1->2->3->null. num = 4。 1)第一种... -
在单链表中删除值相同的多余节点的算法
2019-10-31 13:44:13val时,此时要删除q所指向的节点,所以需要一个s指针记录q,防止发生断链。 struct node { int val; node *next; }; void delDuplication(node *head) { for (node *p=head->next; p; p->next) { ... -
7-6 单链表按值删除 (10 分)
2021-10-24 11:42:25有一字符型单链表List,假设表中无重复值,现要删除指定字符x。删除成功时输出新单链表,否则输出“not found”。 输入格式: 有多组数据,每组数据占两行,代表一次删除操作。 每组第一行有两个数,第一个为表长n... -
删除单链表中所有值为x的数据元素(C语言版)
2021-04-23 20:21:48让两个指针在链表中从头结点开始移动,如果p指针所指向结点的数据域的值与给定的值x相等,就要删除 。因为指针r指向该结点的前驱结点,所以我们可以轻松的进行删除操作 void deletex (LinkList* head, int* x) //head... -
190425打卡:在单链表中删除指定值的节点
2019-04-25 20:03:50删除链表中等于给定值 val 的所有节点。 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3->4->5 思路:有两种解题方式,一种是带虚拟头节点的单链表,另一种是不带虚拟节点... -
在单链表中删除指定值的节点-Java:解法二
2022-01-14 21:58:28分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!... * 在单链表中删除指定值的节点。 * * 思路: * 直接写代码,还是要找到pre节点。 * * @author Created by LiveEveryDay */ public c -
线性表练习之Example018-删除单链表中所有值为 x 的节点
2022-03-28 20:36:40在带头结点的单链表 L 中,删除所有值为 x 的结点,并释放其空间,假设值为 x 的结点不唯一,试编写算法实现上述操作。 -
删除一个单链表中元素值最大结点
2021-08-20 11:39:33#include #include typedef int ElemType; typedef struct LNode { ElemType data;... printf("删除最大值结点\n"); delmaxnode(L); printf("L:");DispList(L); DestroyList(L); return 1; } -
JAVA数据结构问题:在带头结点的单链表中,查找值为X的结点若找到则删除否则输出NO
2021-05-22 18:18:01public class node {//前一个节点private node prev;//后一个节点private node next;//值private t value;public node() {super();}public node(node prev, node next, t value) {super();this.prev = prev;th... -
删除单链表中节点值为x的节点
2021-10-19 08:21:11这里用了两种方式实现: //这一种方式用来三个指针,一个用来遍历的p指针,一个指向p的前驱的pre... } } 删除节点的过程可以分为两步: 找,找到要删除的节点。如何找,通过遍历 删,删除目标节点。如何删,通过前驱 -
sLinkList_单链表删除_erase(x_erase(x_
2021-09-30 02:27:52项目任务在单链表类中增加一个功能erase(x y) 删除表中所有值在 [x y] 之间的结点。假设链表中结点数值类型是整形,要求编程返回删除相应结点后的链表长度和链表元素。输入描述第一行输入链表List的结点元素值,元素... -
在带头结点的单链表中删除所有值为x的结点
2021-05-13 16:08:58个人代码如下所示,欢迎大佬指正。 #include<stdio.h> #include<stdlib.h>...//删除值为x的结点 void Delete(Link& link, int x) { Node* p = link,*q; while (p->next!=NULL) { -
递归函数删除不带头结点的单链表中特定值的结点
2020-07-17 22:03:59DelElem(L,a)的功能是删除以L为首结点指针的单链表中所有值为a的结点。同理,DelElem(L->next,a)则删除以L->next为首结点指针的单链表中所有值等于x的结点。因此Delete即为删除单链表中特定值结点的递归函数... -
删除在单链表中最大值元素(唯一)
2020-03-30 23:59:05删除单链表中最大元素(唯一) 用设定四个指针,两个指针做最大值的标记,两个指针遍历单链表。因为要删除单链表的元素 必须找到它的前置结点,所以有两个指针是指向最大元素的前置结点。 void ListDelnode(Linknode... -
C++实现之单链表中删除指定值
2022-05-08 15:33:12(2) 删除链表中的指定值: 步骤一: 排除特殊情况:头结点值等于需要删除值data,则先直接删除头部节点; 步骤二: 使用快慢指针p, q; if p->val == data q->next = p->next; 删除p... -
单链表查找最大值并删除
2020-10-05 18:54:20试编写在带头结点的单链表中删除一个最大值结点的高效算法。 代码实现: // 在带头节点的单链表中删除一个最大值结点 #include <stdio.h> #include <stdlib.h> using namespace std; // 单链表结构 ... -
在单链表中删除指定值的节点
2017-11-06 16:44:33//在单链表中删除指定值的节点 public class delNode{ //节点的定义 public static class Node{ int value; Node next; public Node(int data) { this.value=data; } } //一、变量法存储 publi -
数据结构【链表01】----删除单链表中所有值为x的节点
2022-03-07 10:28:49在带头结点的单链表L中,删除所有值为x的节点,并释放其内存空间,假设值为x的节点不唯一,试编写算法实现上述代码。 问题分析 使用pre指针指向头节点,用pre->next逐个扫描,如果pre->next节点的值为x,pre... -
删除单链表的最大值
2017-12-02 12:33:48int fine_max() { int max=head.next->data; node* p=head.next->next; while(p) { if(maxdata) max=p->data; p=p->next; } return max; } void erase_data(c -
删除单链表中所有值为x的结点
2019-11-15 20:42:11LinkList Delete_SameX(LinkList L,int x){//删除单链表中所有值为x的元素 LinkList p = L->next;//删除p LinkList pre = L; LinkList q; while(p!=NULL){ if(p->data == x){ q = p; pre->next = q-...