首页 > 代码库 > 剑指Offer11 在O(1)内删除链表结点
剑指Offer11 在O(1)内删除链表结点
1 /************************************************************************* 2 > File Name: 11_DeleteLinkNode.c 3 > Author: Juntaran 4 > Mail: JuntaranMail@gmail.com 5 > Created Time: 2016年08月30日 星期二 02时10分27秒 6 ************************************************************************/ 7 8 #include <stdio.h> 9 #include <malloc.h> 10 #include <string.h> 11 12 // 链表结构体 13 struct ListNode 14 { 15 int val; 16 ListNode* next; 17 }; 18 19 // 构造链表 20 ListNode* createList() 21 { 22 struct ListNode* head; 23 struct ListNode* p; 24 struct ListNode* q; 25 head = p = (ListNode*)malloc(sizeof(ListNode)); 26 head->val = 0; 27 for (int i = 1; i <= 10; ++i) 28 { 29 q = (ListNode*)malloc(sizeof(ListNode)); 30 q->val = i; 31 p->next = q; 32 p = q; 33 } 34 p->next = NULL; 35 return head; 36 } 37 38 // 顺序输出链表 39 void PrintList(ListNode* head) 40 { 41 if (head == NULL) 42 return; 43 ListNode* temp = head; 44 printf("PrintList:\n"); 45 while (temp != NULL) 46 { 47 printf("%d ", temp->val); 48 temp = temp->next; 49 } 50 printf("\n"); 51 } 52 53 // 删除结点 54 void DeleteListNode(ListNode** head, ListNode* key) 55 { 56 if (head==NULL || key==NULL) 57 return; 58 59 // 如果要删除头结点 60 if (*head == key) 61 { 62 *head = (*head)->next; 63 free(key); 64 key = NULL; 65 return; 66 } 67 68 // 如果要删除尾结点 69 if (key->next == NULL) 70 { 71 ListNode* temp = *head; 72 while (temp->next != key) 73 temp = temp->next; 74 75 temp->next = NULL; 76 free(key); 77 key = NULL; 78 return; 79 } 80 81 // 其他情况 82 ListNode* temp = key->next; 83 key->val = temp->val; 84 key->next = temp->next; 85 86 free(temp); 87 temp = NULL; 88 89 } 90 91 92 int main() 93 { 94 ListNode* test = createList(); 95 PrintList(test); 96 97 ListNode* key1 = test; // 头结点测试 98 ListNode* key2 = test->next->next; // 正常情况测试 99 ListNode* key3 = test;100 while (key3->next)101 {102 key3 = key3->next; // 尾结点测试103 }104 105 printf("key1 is %d\n", key1->val);106 printf("key2 is %d\n", key2->val);107 printf("key3 is %d\n", key3->val);108 109 DeleteListNode(&test, key1);110 PrintList(test);111 DeleteListNode(&test, key2);112 PrintList(test);113 DeleteListNode(&test, key3);114 PrintList(test);115 116 return 0;117 }
剑指Offer11 在O(1)内删除链表结点
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。