剑指offer面试题13在O(1)时间复杂度内删除单链表的一个节点

15 篇文章 0 订阅
9 篇文章 0 订阅

今天遇上奇怪的事情了。。codebloks运行不了 说sh: .....upexpected ( 我找了半天bug 最后发现竟然连helloword程序都执行不了

后来我觉得 会不会是 project命名的里 O(1) 然后试着把括号去掉。。居然就行了 后来又建工程加上括号 又是那个错。。

太尼馬诡异了。。。

还有就是 linux里面 EOF  是ctrl+d 不是C 记得windows里是c 然后白书里还说过这个问题。。


没看书直接写了  出现了严重的问题。。自己考虑不周到 太不周到了。。

第一个 如果要删除的是末尾的指针怎么办 不能直接删 必须处理倒数第二个的next指针 那只能直接顺序遍历了

还有 如果链表只有一个节点 那应该首先检查到 要删的节点next 是null然后 如果head和delete相等 那么 head要赋值null

代码还是重写把


/*
这个题目太经典了 是刚才自己想到答案的。。
要求写一个函数 参数是头指针和要删除的指针 删除要删的节点
其实不一定要删那个节点
把要删除节点的next的data 赋值给要删的节点 然后要删的节点指向next的next
然后删next
*/
#include<iostream>
#include<cstdio>
using namespace std;

struct Node
{
    int data;
    Node  * next;
    Node (int n)
    {
        data=n;
    }
    ~Node()
    {
        cout<<"delete node "<<data<<endl;
    }
};
//head指针是非常有用的! 如果要删最后一个节点,一定要考虑全面!。。但是题目原型是这么给出的额
void DeleteoNode(Node * head, Node * p_delete)
{
    if (!head || !p_delete)
    return ;
    if(head==p_delete)// 头尾相等 直接删掉 头赋值NULL
    {
        delete p_delete;
        head=NULL;
        return ;
    }
    if(p_delete->next==NULL)//末尾节点 找到前的 然后赋值NULL
    {
        Node * p = head;
        while(p->next!=p_delete)
        p=p->next;
        p->next=NULL;
        delete p_delete;
        return ;
    }
    Node * del=p_delete->next;;
    p_delete->data=p_delete->next->data;
    p_delete->next=p_delete->next->next;//这里出现bug半天啊。。。p->next已经变了。。用指针一定要小心 要小心
    delete del;
    del =NULL;
}

int main()
{
    int n;
    //freopen("/home/gl/in","r",stdin);
    Node * p_head=new Node(0);
    Node * p=p_head;
    Node * p_delete;

    while(scanf("%d",&n)!=EOF)
    {
        p->next=new Node(n);
        if(n==5)//假如这里我们要删除 等于5的节点
        p_delete=p->next;
        p=p->next;
    }

    p=p_head;
    while(p!=NULL)
    {
        printf("%d\t",p->data);
        p=p->next;
    }


    DeleteoNode(p_head,p_delete);
    p=p_head;
    while(p!=NULL)
    {
        printf("%d\t",p->data);
        p=p->next;
    }
    return 0;
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值