您的位置:首页 > 其它

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

2017-04-03 20:06 281 查看
分析:之所以是 O(n) ,是因为我们要从头开始查找(因为我们要找到删除结点的前一个结点)。

如果我们把下一个结点的值复制到需要删除的结点上,然后删除下一个结点,这样就相当于把原结点删掉了。

注意:

如果要删除的链表是在链表的尾部,那么我们就需要重新顺序查找了

如果链表中只有一个结点那么,那么我们删除结点后,需要把头节点的指针置空。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: