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

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

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

#include <stdio.h>
#include <stdlib.h>
/*
 *就这么一道题调试了半个多小时,由于涉及多次输入操作,在一次输入未彻底完成前,添加打印信息会失真
 *调试出的原因就是在删除节点时,指针指向搞反了
 */
typedef struct ListNode
{
    int value;
    struct ListNode *pNext;
}listNode;
int main() {
    int a, b,num, del;
    listNode *head=NULL,*rear=NULL,*tmp=NULL;
    while (scanf("%d %d", &num, &a) != EOF) {
        head = (listNode *)malloc(sizeof(listNode));
        tmp = (listNode *)malloc(sizeof(listNode));
        head->pNext=tmp;
        tmp->pNext=NULL;tmp->value=a;
        //printf("%d %d\n",num,a);
        for(int i=0;i<num-1;++i)
        {
            rear=head->pNext;
            scanf("%d %d", &a, &b);
            //printf("%d %d ", a, b);

            while(rear)
            {
                if(rear->value==b)
                {
                    tmp=(listNode *)malloc(sizeof(listNode));
                    tmp->pNext=rear->pNext;
                    rear->pNext=tmp;tmp->value=a;
                    break;
                }
                rear=rear->pNext;
            }
        }
        scanf("%d",&del);           
        tmp=head->pNext;rear=head;
        while(tmp)
        {
            if(tmp->value==del)
            {
                if(tmp == head)
                {
                    head=head->pNext;
                    free(tmp);
                    tmp=head;rear=head;
                }    
                else {
                    rear->pNext=tmp->pNext;
                    free(tmp);
                    tmp=rear->pNext;
                }
            }
            else {
                rear=tmp;tmp=tmp->pNext;
            }
        }
        if(head->pNext==NULL) printf("\n");
        else
        {   
            rear=head->pNext;
            while(rear)
            {
                printf("%d ", rear->value);
                tmp=rear;rear=rear->pNext;free(tmp);
            }
        }
    }
    return 0;
}

全部评论

相关推荐

讲原则的小黄鸭不愿吃...:有时候面试眼缘确实很重要,当然,飞驰人生2中张弛说的很对:我努力了无数次,但是我知道机会只会出现在其中一两次。你把每一次笔试面试都全力以赴,总有你运气发挥到位的时候
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务