在 O(1) 的时间内删除单链表的结点

  1. 分析:之所以是 O(n) ,是因为我们要从头开始查找(因为我们要找到删除结点的前一个结点)。
  2. 如果我们把下一个结点的值复制到需要删除的结点上,然后删除下一个结点,这样就相当于把原结点删掉了。
  3. 注意:
    如果要删除的链表是在链表的尾部,那么我们就需要重新顺序查找了
    如果链表中只有一个结点那么,那么我们删除结点后,需要把头节点的指针置空。

#include <iostream>

using namespace std;

typedef struct NodeList{

    int data ;

    NodeList * next;

}NodeList;

typedef NodeList *  LinkList;

void initNode(LinkList * head){

    * head = (LinkList)malloc(sizeof(NodeList));

    (* head)->data = 0;

    (* head)->next = NULL;

}

void insertNode(LinkList  head, int data){

    if(head == NULL)

        return;

    LinkList p = (LinkList)malloc(sizeof(NodeList));

    p->data = data;

    p->next = NULL;

    LinkList f = head;

    while (f->next != NULL) {

        f = f->next;
    }

    f->next = p;

}

void printfList(LinkList head){

    LinkList p = head->next;

    while(p != NULL){

        cout<<p->data;

        p = p->next;

    }
}

void destoryNode(LinkList head){

    LinkList p,q;

    p = head->next;

    while(p != NULL){

        q = p->next;

        free(p);

        p = q;
    }

    head->next = NULL;

}


void deleteNode(LinkList* head, LinkList pToBeDeleted){

    if((*head) == NULL ||  pToBeDeleted == NULL)

        return;

    //删除的结点不是尾节点
    if(pToBeDeleted->next != NULL){

        LinkList next = pToBeDeleted->next;

        pToBeDeleted->next = next->next;

        pToBeDeleted->data = next->data;

        free(next);

        next = NULL;
    }else if((*head)->next == pToBeDeleted){
        // 只有一个结点

        free(pToBeDeleted);

        (*head)->next = NULL;

        pToBeDeleted = NULL;
    }else{
        // 如果删除的是尾节点
        LinkList p = (*head)->next;

        while(p->next != pToBeDeleted){

            p = p->next;
        }

        p->next = NULL;

        free(pToBeDeleted);

        pToBeDeleted = NULL;
    }

}

int main(int argc, const char * argv[]) {

    LinkList head ;

    initNode(&head);

    insertNode(head, 1);

    deleteNode(&head, head->next);

    printfList(head);

    return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值