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

今天遇上奇怪的事情了。。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
#include
using namespace std;

struct Node
{
    int data;
    Node  * next;
    Node (int n)
    {
        data=n;
    }
    ~Node()
    {
        cout<<"delete node "<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;
}




你可能感兴趣的:(面试,offer。。。,笔试)