【剑指offer 面试题13】在 O(1) 时间删除链表结点
1 #include <iostream> 2 using namespace std; 3 4 //构造链表结点 5 struct ListNode 6 { 7 int val; 8 ListNode *next; 9 10 ListNode(int v = 0):val(v), next(NULL){}; 11 }; 12 13 //打印结点 14 void printList(ListNode *head) 15 { 16 while(head != NULL) 17 { 18 cout<<head->val<<" "; 19 head = head->next; 20 } 21 cout<<endl; 22 } 23 24 //删除结点 25 void deleteListNode(ListNode **head, ListNode *tobeDeleted) 26 { 27 //头结点或者待删除结点为空,则结束调用 28 if(*head == NULL || tobeDeleted == NULL) 29 return ; 30 31 //待删除结点的pnext非空,则复制其值到待删除结点,删除pnext 32 if(tobeDeleted->next != NULL) 33 { 34 ListNode *pnext = tobeDeleted->next; 35 36 tobeDeleted->val = pnext->val; 37 tobeDeleted->next = pnext->next; 38 39 delete pnext; 40 pnext = NULL; 41 } 42 //若只剩头结点,则删除头结点 43 else if(tobeDeleted == *head) 44 { 45 delete tobeDeleted; 46 47 tobeDeleted = NULL; 48 *head = NULL; 49 } 50 //若待删除结点为尾结点,则顺序查找后删除 51 else 52 { 53 ListNode *phead = *head; 54 55 while(phead->next != tobeDeleted) 56 { 57 phead = phead->next; 58 } 59 60 phead->next = NULL; 61 delete tobeDeleted; 62 tobeDeleted = NULL; 63 } 64 } 65 66 int main() 67 { 68 ListNode *ls = new ListNode(0); 69 ListNode *head = ls; 70 71 ListNode *l1 = new ListNode(1); 72 ls->next = l1; 73 ls = ls->next; 74 75 ListNode *l2 = new ListNode(2); 76 ls->next = l2; 77 ls = ls->next; 78 79 ListNode *l3 = new ListNode(3); 80 ls->next = l3; 81 ls = ls->next; 82 83 ListNode *l4 = new ListNode(4); 84 ls->next = l4; 85 ls = ls->next; 86 87 cout<<"初始链表 -> "; 88 printList(head); 89 cout<<endl; 90 91 cout<<"删除中间结点2后 -> "; 92 deleteListNode(&head,l2); 93 printList(head); 94 cout<<endl; 95 96 cout<<"删除尾结点4后 -> "; 97 deleteListNode(&head,l4); 98 printList(head); 99 cout<<endl; 100 101 cout<<"删除中间结点1后 -> "; 102 deleteListNode(&head,l1); 103 printList(head); 104 cout<<endl; 105 106 cout<<"删除尾结点3后 -> "; 107 deleteListNode(&head,l1); 108 printList(head); 109 cout<<endl; 110 111 cout<<"删除头结点后 -> "; 112 deleteListNode(&head,head); 113 printList(head); 114 cout<<endl; 115 }
测试结果:
初始链表 -> 0 1 2 3 4 删除中间结点2后 -> 0 1 3 4 删除尾结点4后 -> 0 1 3 删除中间结点1后 -> 0 3 删除尾结点3后 -> 0 删除头结点后 ->