精华内容
下载资源
问答
  • pointer *p,*q=NULL; p=find(head,i+1); cout<<p->data;... 网上的实现方法都是删除p的后继结点,我想直接删除p,按照我的想法上述语句应该是正确的,但是执行时候q->next=p出显示又断点,怎么破 大神救我
  • 题目描述:在一个单链表中,不知道头结点,也不知道有多长和是否存在循环,要求删除指针P所指的节点,注意P不为最后一个节点!\color{blue}{题目描述:}\color{purple}{在一个单链表中,不知道头结点,也不知道有多...

    PP
    解题思路:
    一般情况下要删除指针P所指的节点就必须先从头结点开始遍历整个单链表直到找到P节点的前一个节点然后再怎么操作这大家都是知道的,这不是我的重点,所以就不写了!
    但是遍历整个单链表是有条件的,必须知道头结点,平均情况算法时间复杂度为n/2 ,与题目要求不相符合。
    因此我们发现本题并不能通过遍历俩实现,所以就死了这条心。那么究竟该用什么方法呢?历史书上的狸猫换太子大家并不陌生,下面我来说明这算法中的“狸猫换太子”。我们可以把p所指节点的下一个节点的值赋值给P所指的节点,因此就就可以通过删除下一个节点而达到目的!具体操作就不用多说了,思想最重要,其余的都是浮云!

    总结:在一些问题中通过常规思维我们并不能达到目的,因此平时思考的时候除了通过最常规的思维外想想还能不能通过反常规的思维实现,说不定以后工作当中就会出现这样的问题。举个例子:把变量a,b的值交换:90%的人会借助一个变量暂存其中一个的值:实现如下:
    

    x=a;a=b;b=x;

    但是我们如果不借助变量怎么实现呢?如下:
    a=a+b;b=ab;a=ab;

    一下就可以看出来:如果自己觉得不看不出来,就写个代码就可以了。

    展开全文
  • 1,算法描述:无头单链表中删除指针p所指向的结点  注意:是没有头结点的。  算法思想:我们无法得到p所指结点的前驱,但是其后继是知道的,当前结点和后继结点的区别是data的不同,我们可以将p所指向结点的...

    1,算法描述:在无头单链表中,删除指针p所指向的结点

          注意:是没有头结点的。

          算法思想:我们无法得到p所指结点的前驱,但是其后继是知道的,当前结点和后继结点的区别是data的不同,我们可以将p所指向结点的后继的值赋给p所指向的结点,将p所指向结点的后继删除,将该后继的后继地址赋给p的next。即

          q=p->next;

          p->data=q->data;

          p->next=q->next;

          free(q);

          注意这里p所指向的结点不能是最后一个结点,否则直接删除后,其前驱的next域无法置为NULL。

          代码如下:

           

    #include "stdafx.h"
    #include<stdio.h>
    #include <malloc.h>
    #define SIZE  100
    #define  INCREMENT_SIZE 10
    typedef struct  LNode
    {
       int data;
       LNode *next;
    }LNode,*LinkList;
    
    //creat a LinkList
    bool creatLinklist(LinkList&L,int n)
    {
    	LinkList p,q,t,s;
    	L=(LNode*)malloc(n*sizeof(LNode));
    	if(!L)
    		return false;
    	q=L;
    	for(int i=1;i<=n;i++)
    	{
    		p=(LNode*)malloc(sizeof(LNode));
    		scanf("%d",&p->data);
    		L->next=p;
    		L=p;
    	}
    	p->next=NULL;
    	L=q;
    	return true;
    }
    
    //delete a Node in a Linklist without headNode
    bool LinkNoHeadlistDelete(LinkList &p)
    {
    	LinkList q;
    	if(!p)
    		return false;
    	q=p->next;
    	if(q)
    	{
    		p->data=q->data ;
    		p->next=q->next;
    		free(q);
    		return true;
    	}
    }
    
    
    void main()
    {
    	LinkList Llist,p,t;
    	int k;
    	int len;
    	int elemet;
    	int position;
    	printf("input the number of LinkList to be created:");
    	scanf("%d",&k);
    	creatLinklist(Llist,k);
    	printf("\n");
    	t=Llist;
    	for(int i=0;i<k-4;i++)
    		t=t->next;// random a Node
    	LinkNoHeadlistDelete(t);
    	printf("output the new LinkList:\n");
    	p=Llist->next;
    	while(p)
    	{
    		printf("%d ",p->data);
    		p=p->next;
    	}
    	printf("\n");
    	free(Llist);
    }
    运行结果如下:


    展开全文
  • 删除一个链表的最小值节点,首先想到的是肯定是要定义两个指针,但是 ,这里首先要找到最小。 所以两个指针变量肯定不够。 肯定是先要找出最小值。 那么如何找出最小值呢? 这里先定义pre 和p指针,然后定义minp...

    单链表的存储结构:

    typedef struct LinkList{
            int data;
            LinkList * next;
        }
    

    分析:
    要删除一个链表的最小值节点,首先想到的是肯定是要定义两个指针,但是 ,这里首先要找到最小。 所以两个指针变量肯定不够。 肯定是先要找出最小值。
    那么如何找出最小值呢?
    这里先定义pre 和p指针,然后定义minp保存最小节点指针(初值为p),minpre指向*minp节点的前驱节点(初值为pre)。

    思路:
    1.定义四个指针变量并赋好值
    2.通过while循环,条件为p != null,如果p->data < minp->data.,则将p赋值给minp; 否则,指针同步后移
    3.如果p != null,表明找到了该该节点,则删除,
    minpre ->next = minp ->next;
    free(minp); 删除minp节点

    C代码实现:

    
        void delmincode(LinkList * L){
            LinkList * pre ,p = pre->next;
            LinkList * minpre = pre,minp =p; //赋好初值
            while(p != null){
                if(p-data < minp->data){
                    minp = p;
                    minpre = pre;
                }
            }
           minpre->next = minp->next; //删除minp节点
           free(minp);
        }
    
    展开全文
  • 带头结点单链表L中删除一个最小值结点。假设最小值结点唯一。 算法思想: 核心代码: void del_min(LNode* &L) { LNode *p,*pre,*minp,*minpre; pre=minpre=L; p=minp=L->next; while(p!=NULL) { ...

    题目描述:

    带头结点的单链表L中删除一个最小值结点。假设最小值结点唯一。

    算法思想:

    核心代码:

    void del_min(LNode* &L)
    {
        LNode *p,*pre,*minp,*minpre;
        pre=minpre=L;
        p=minp=L->next;
        while(p!=NULL)
        {
            if(p->data<minp->data)
            {
                minpre=pre;
                minp=p;
            }
            pre=p;
            p=p->next;
        }
        minpre->next=minp->next;
        free(minp);
        minp=NULL;
    /*
    free和delete它们只是把指针所指的内存给释放掉,但并没有把指针本身处理掉。
    用调试器跟踪示例程序,发现指针p被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p 成了“野指针”。
    如果此时不把p设置为NULL,会让人误以为p是个合法的指针。
    */
    }
    
    展开全文
  • 设计一个递归算法,删除不带头结点单链表中所有值为x的结点具体的代码如下:void Del_X_3(LinkList &L,ElemType x) { LNode *p; //p指向待删除结点,if(L==NULL) //递归出口 return ; if(L->data==x) { p...
  • 设计一个算法,删除一个单链表L元素值最大的结点(假设最大值结点是唯一的)。 #include <stdio.h> #include<malloc.h> typedef struct Node { int data; struct Node *next; }LinkList; void ...
  • 4·试编写带头结点单链表1中删除一个最小值结点的高效算法(假设最小值结点是唯一的)。 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<...
  • 先将单链表遍历遍,记录单链表的长度,找到删除结点的位置,删除。 注意: 这里是单链表,应该判断是否删除的是头结点,如果是,则更新头结点,并返回头结点的位置。 class Solution { public: ListNode *...
  • 删除单链表中的倒数第k个结点

    千次阅读 2018-05-16 20:36:00
    算法思想:定义两指针,pFast和pSlow,都指向头结点,pFast先后移k-1位,使pFast指向第k个结点,此时... 删除单链表中的倒数第k个结点,首先要确定倒数第k个结点的位置。//查找指向链表的倒数第k个结点的指针...
  • 这是一道算法题,写算法...这是一个无序的单链表,我们采用一种最笨的办法,先指向首元结点,其元素值为2,再遍历该结点后的所有结点结点元素值与其相同,则删除;全部遍历完成后,我们再指向第二个结点,再进...
  • typedef struct LNode { ElemTpye data; struct LNode *next; }LNode,*LinkList; ...L) ...p=p->next) { for(q=p->next,s=p;q!=NULL;q=q->next) { if(q->next->data==p->.
  • #include"initList/initList.h" ... LinkList* p;//工作节点 LinkList* minpre;//最小值前驱节点 LinkList* min;//最小值节点 pre = L,minpre = pre; p = L->next,min = p; if(p==NULL) return ...
  • 带头结点单链表中删除一个最小值结点的算法。 Node.java /* * 节点类的泛型定义 */ public class Node<T> { T data; Node<T> next; public Node(Node<T> n){ next = n; } public ...
  • 假设单链表带头结点,尾插法新建一个单链表,将值不等于x的元素存放其中。 代码1: void delAllSame(LNode *&L,int x){//用尾插法建立一个新的单链表,将值不为x的元素链接到表尾 LNode *p=L->next,*r=...
  • 设计在单链表中删除值相同的多余结点算法。

    万次阅读 多人点赞 2019-01-15 17:21:29
    程序代码如下示: #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; #include&amp;lt;assert.h&amp;gt; #define LEN 10 typedef int Elemtype; typedef ...
  • 单链表中插入一个结点

    千次阅读 2019-06-03 15:55:27
    1. 对于一个具有N个结点单链表给定值为x的结点后插入一个结点的时间复杂度为()。 A.O(1) B.O(N/2) C.O(N) D.O(N^2) 正确答案:C 2.对于一个具有N个结点单链表已知的结点*p后插入一个结点的...
  • 题目:设计一个递归算法,删除不带头结点单链表中所有值为x的结点。 代码实现 //设计一个递归算法,删除不带头结点单链表L所有值为x的结点 #include"head.h"; typedef int Elemtype; //定义单链表 typedef ...
  • 要求:删除一个递增非空单链表中值域重复的结点 void delete(LNode *L) { LNode *p,*q; p = L->next;//p指向第一个结点 while(p != NULL) { if(p->data == p->next->data)//如果相等则删除q指向的...
  • =NULL) //用p扫描整个单链表,pre始终指向其前驱结点 { if (maxp->data<p->data) //找到一个更大的结点 { maxp=p; //更改maxp maxpre=pre; //更改maxpre } pre=p; //p、pre同步后移...
  • 查找单链表中的倒数第m个结点

    千次阅读 2014-12-20 16:44:54
    例4,设计一个算法求出单链表的倒数第m个结点,要求不得求出链表长度,不得对链表进行逆转,如果找到该结点就返回它的地址,否则就返回NULL。  【分析】该题目要求求出单链表的倒数第m个结点,但又不能逆转单链表。...
  • 删除单链表中一个结点

    千次阅读 2013-05-25 10:17:20
    单向链表中删除一个结点,最常规的方法是从链表的头结点开始,顺序遍历,查找要删除结点。如果该结点在链表,则删除结点。这种情况通常是指明要删除的值,我们要通过比较链表中结点的值与给定的值是否相等来...
  • 先对链表进行排序在删除数相等的结点: 已知单链表的无头节点head void sortDel() //排序+删除 {  pStu p, q, temp1;  int temp;  p = head;  for( p ; NULL != p->Next ; p = p->Next )  {
  • typedef struct node { int data; struct node *next; }lklist;...void delredundant(lklist *&... lklist *p,*q,*s;... for(p=head;p!...p=p->next) { for(q=p->next,s=q;q!=0;) ...
  • 首先,我们要删除一个值为x结点的前驱结点,则该链表要包含两个及以上结点才行。 前面通常都是删除该节点,而这次是删除该节点的前驱结点。 所以不能向以往一样定义两个指针。而应该定义三个指针。 prepre , pre...
  • #include #include  typedef struct node{  int data;  struct node *next;  } LinkList;  LinkList* initialList(LinkList *linkList){  linkList = NULL;... LinkList *p;  int my

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,523
精华内容 13,009
关键字:

在一个单链表中,若删除p所指结点