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

来源:互联网 发布:mac装windows10系统 编辑:程序博客网 时间:2024/05/22 03:30
  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