1 題目描述
給定單向鏈表的都指針和一個節點指針,定義一個函數在 O(1)的時間內刪除該節點。
2 解法描述
- 常規情況下,需要遍歷整個鏈表,找到待刪節點的前驅節點,然後將前驅節點的 next 指針指向待刪節點的 next 指針指向的位置。時間複雜度爲 O(n)
- O(1) 時間複雜度解法,待刪節點複製其後繼節點的值,然後將後繼節點刪掉。
3 解法 2 實現
一般情況:待刪節點位於鏈表的中間位置
特殊情況:待刪節點位於鏈表的尾部
#include<stdio.h>
typedef int ElemType;
typedef struct node{
ElemType data;
struct node* next;
}LNode,*LinkList;
void createList_tail(LinkList *L){
ElemType temp;
LNode* p,*r;
*L =(LinkList) malloc (sizeof(LNode));
(*L)->next=NULL;
(*L)->data=-1;
r=(*L);
scanf("%d",&temp);
while(temp != -1){
p=(LinkList) malloc (sizeof(LNode));
p->data = temp;
p->next=NULL;
r->next =p;
r=p;
scanf("%d",&temp);
}
}
LNode* getElme(LinkList L,int i){
int j=1;
LinkList p = L->next;
if(i<0) return NULL;
if(i==0) return L;
while(p&&j<i){
p=p->next;
j++;
}
return p;
}
void showList(LinkList L){
LinkList temp = L->next;
while(temp!= NULL){
printf("%d ",temp->data);
temp = temp->next;
}
}
void deleteNode(LNode* head,LNode* _delete){
//異常情況
if(head==NULL || _delete==NULL) return;
//一般情況 _delete 位於中間部分
if(_delete->next!=NULL){
LNode* temp= _delete->next;
_delete->data=temp->data;
_delete->next=temp->next;
free(temp);
}else{ //特殊情況,_delete是最後一個結點
LNode* temp;
for(temp=head;temp->next!=_delete;temp=temp->next);
temp->next=NULL;
free(_delete);
}
}
void main(){
LinkList L;
//輸入 1 2 3 4 5 6 -1
createList_tail(&L);
//獲取第二個元素 2
LNode* _delete=getElme(L,2);
//刪除第二個元素 2
deleteNode(L,_delete);
//獲取第後一個元素 6
_delete=getElme(L,5);
//刪除最後一個元素 6
deleteNode(L,_delete);
showList(L);
}