面試題 13

1 題目描述

給定單向鏈表的都指針和一個節點指針,定義一個函數在 O(1)的時間內刪除該節點。


2 解法描述

  1. 常規情況下,需要遍歷整個鏈表,找到待刪節點的前驅節點,然後將前驅節點的 next 指針指向待刪節點的 next 指針指向的位置。時間複雜度爲 O(n)
  2. 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);
}
發佈了48 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章