题解 | #从单向链表中删除指定值的节点#

从单向链表中删除指定值的节点

http://www.nowcoder.com/practice/f96cd47e812842269058d483a11ced4f

笑死了,根本不会链表。没学过数据结构,只能用暴力搜索解决,测控人泪目。


先将头结点写入,

然后按顺序将下面的结点写入。

在写入过程中,要检索下一个将要写入的结点与前面已写入的结点的关系,相同则在相同处插入。

若在链中插入,则需要将后方已经确定的结点都后移。

后移可以从最后一位开始移动,如此避免从中间开始移动需要的寄存器,节省了时间。

不过检索的过程浪费了一些时间,应该把检索的范围和已经确定的结点长度联系起来,这样可以减少循环次数,还没想好,欢迎大佬指点。


改好了,第二个循环里N改成i。不过第三重循环还是有问题。


为什么牛客网中等难度的题目难度差这么多。

这合理吗?

动态申请内存比暴力申请最大内存还要浪费空间。

这合理吗?

牛客网判题系统吃了薛定谔吧。

alt

#include<stdio.h>


int N,HEAD,DELTE;
int pull_1,pull_2,*pull_list,*chain;
int i=0,j=0,k=0;

int main()
{
    scanf("%d",&N);
    scanf("%d",&HEAD);
    
   pull_list=(int*)calloc(2*N+1,sizeof(int));//动态申请内存反而比暴力直接申请10000更浪费,
   chain=(int*)calloc(N+1,sizeof(int));//判题系统真是令人无语,这合理吗?
   
    
    
    for(i=0;i<N-1;i++)//结点信息
    {
        scanf("%d %d ",&pull_1,&pull_2);
        pull_list[2*i]=pull_1;
        pull_list[2*i+1]=pull_2;
            
    } 
   
   
    chain[0]=HEAD;  //头结点
    
    for(i=0;i<N;i++)//按序检索要插入的结点的首地址
    {
         for(j=0;j<i;j++)//以已经确定的结点做为标志
         //范围与写入次数有关
         {
             if(pull_list[2*i+1]==chain[j])//判断插入位置
             {
                 
                for(k=i;k>j;k--)//将插入位置空出 
                //此处的i其实有些问题,不知道
                {
                 chain[k+1]=chain[k];  //移位
                }    
                 chain[j+1]=pull_list[2*i];//插入
             }
             
         }
        
        
    }
    
    
    scanf("%d\n",&DELTE);
    for(i=0;i<N;i++)//删除结点
    {
        if(chain[i]==DELTE)
        {
            for(j=i;j<N;j++)
            {
                chain[j]=chain[j+1];//移位
            }
        }
        
    }
    
    for(i=0;i<N-1;i++)
    {
        printf("%d ",chain[i]);
    }
    
    
    //i++;
    
    free(pull_list);
    free(chain);    
    
    
    
}
全部评论

相关推荐

评论
2
收藏
分享
牛客网
牛客企业服务