1. 程式人生 > >給定單向鏈表的頭指針和一個結點指針,定義一個函數在O(1)時間刪除該結點。

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

刪除 oid ext void print eno 只有一個 尾結點 tdi

鏈表結構如下:

typedef struct Node{
    int num;
    struct Node *next;
}NodeHead,*Nodes;

刪除函數如下:

void DeleteNode(Nodes head,Nodes target)

很簡單的想法就是,要刪除該結點,可以把該結點的下一個結點的值賦給該結點,接著刪除下一個結點即可。

但要考慮三種情況,一是該結點是尾結點,二是除了頭結點以外,只有一個結點,三是只有頭結點,不過這樣那就直接返回就可以啦。

以下是代碼,很簡單,就不需要註釋了,只要把以上三種情況都考慮進去,就可以了。

#include <stdio.h>
#include 
<string.h> typedef struct Node{ int num; struct Node *next; }NodeHead,*Nodes; void DeleteNode(Nodes head,Nodes target){ if(head->next==NULL) return ; if(target->next==NULL){ if(head->next==target){ head->next = NULL; free
(target); }else{ Nodes tmp = head->next; while(tmp->next!=target){ tmp = tmp->next; } tmp->next = NULL; free(target); } return ; } Nodes tmp = target->next; target->num = tmp->num; target
->next = tmp->next; free(tmp); } void main() { Nodes head = NULL; head = (Nodes)malloc(sizeof(NodeHead)); head->next = NULL; int i ; for(i = 0 ;i < 4 ; i++){ Nodes node = (Nodes)malloc(sizeof(NodeHead)); node->num = i; node->next = head->next; head->next = node; } Nodes tmp; tmp = head->next; tmp = tmp->next; tmp = tmp->next; DeleteNode(head,tmp); Nodes tmp2; tmp2 = head->next; for(i = 0 ; i <3 ; i++){ printf("%d",tmp2->num); tmp2 = tmp2->next; } return 0; }

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