【剑指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

删除头结点后 ->

 

posted @ 2015-06-20 15:13  tjuloading  阅读(166)  评论(0)    收藏  举报