- 分析:之所以是 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;
}