剑指Offer11 在O内删除链表结点
Posted Juntaran
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer11 在O内删除链表结点相关的知识,希望对你有一定的参考价值。
1 /************************************************************************* 2 > File Name: 11_DeleteLinkNode.c 3 > Author: Juntaran 4 > Mail: [email protected] 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内删除链表结点的主要内容,如果未能解决你的问题,请参考以下文章