給定單向鏈表的頭指針和一個結點指針,定義一個函數在O(1)時間刪除該結點。
阿新 • • 發佈:2017-08-01
刪除 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)時間刪除該結點。